C ++ инициализирующий объект и выделяющий память

0

У меня есть структура вроде:

struct myNode{
    Node node; // node object takes just name parameter I mean node(string name);
    int value;
};

И в моей функции main() у меня есть указатель struct myNode, и я хочу сначала прочитать файл, чтобы получить имя объекта и значения узла (просто целое число), а затем создать соответствующую структуру myNode. Для этого я пишу

int main(){
    struct myNode * myRoot;
    ifstream myfile (fileName);
    string line;
    getline(myfile,line);
int value=getValue(line);
myRoot= new myNode();
    myRoot->value=value;
myRoot->node=node a(line);

  return 0;    
}

Тем не менее, я не уверен, это правильный способ или нет, есть ли кто-нибудь, кто мог бы мне помочь?

  • 0
    Где определен Node ? Покажите нам больше.
  • 2
    Кроме того, node a(line); очень подозрительно
Показать ещё 3 комментария
Теги:
class
oop

2 ответа

0

Среди многих смертоносных проблем в вашем коде, тот, который я вижу, должен быть для вас наиболее неприятным, - это тот, который на этой строке:

myRoot->node = node a(line);

node a(line) является синтаксической ошибкой. Я полагаю, вы это понимали:

myRoot->node = node(line);

или, если Node не имеет explicit конструктора:

myRoot->node = line;

Другими опасными проблемами являются тот факт, что вы используете указатели, выделяя new (оба из которых являются ненужными) и что вы выполняете извлечение в потоке файлов, не проверяя, работает ли он. Все это можно решить, выделив объекты в стеке и проверив, удалось ли выполнить вход:

int main()
{
    myNode myRoot;
    ifstream myfile(fileName);
    string line;

    if (getline(myfile, line))
    {
        int value = getValue(line);
        myRoot.value = value;
        myRoot.node  = line;
    }    
}
0

Да, он может работать, кроме:

  1. Вы забыли удалить myRoot перед выходом функции main. Да, os может перерабатывать его, когда вы выходите из программы, но вы можете сделать свой код более изящным.
  2. myRoot->node= node a(line) может быть просто myRoot->node = Node(line) или myRoot->node = line если конструктор конструктора myRoot->node = line может принимать линию как единственный параметр. Я полагаю, вы рассматриваете как временный экземпляр узла.
  • 1
    myRoot-> node = line, если конструктор struct Node может принимать строку как единственный параметр - Нет! Поскольку myRoot->node уже произошло, наличие такого конструктора не поможет. Это будет работать только в том случае, если есть оператор присваивания, принимающий string или сам Node является string .
  • 0
    @ legends2k Извините, я что-то пропустил. Если есть оператор =, который принимает строку или другой экземпляр узла, он будет работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню