Когда я компилирую свой код в Dev C++, я получаю эту ошибку: [Ошибка] Id вернул 1 статус выхода

Это код простой программы с двоичным деревом:

 #include <iostream>
 using namespace std;

template <class Tree>

class node
{
public:
    node()
    {
        this->tree=NULL;
        this->leftnode=this->rightnode=NULL;

    };

    ~node();

    node(Tree* base)
    {
        this->tree=base;
        this->leftnode=this->rightnode=NULL;
    };

    Tree* getnodevalue()
    {
        return this->tree;
    };

    node* getleftnode()
    {
        return leftnode;
    };

    node* getrightnode()
    {
        return rightnode;
    };

    void newleft(node* val)
    {
        this->leftnode=val;
    };

    void newright(node* val)
    {
        this->rightnode=val;
    };

    void newnode(Tree* val)
    {
        this->tree=val;
    };

    int chkleaf()
    {
        if(this->leftnode==NULL && this->rightnode==NULL)
            return 1;
        return 0;
    }

    void insert(node* nextnode, int* value)
    {
        node <int>* nodecounter= new node<int>(value);
        node<int> *p, *q;
        p=q=nextnode;

        while(*value!=*(p->getnodevalue()) && q!=NULL)
        {
            p=q;
            if(*value<*(p->getnodevalue()))
                q=p->getleftnode();
            else
                q=p->getrightnode();

        };

        if(*value==*(p->getnodevalue()))
        {
            cout<<"Duplicate"<<*value<<"\n";
            delete nodecounter;
        }
        else if(*value<*(p->getnodevalue()))
            p->newleft(nodecounter);
        else
            p->newright(nodecounter);
    };


    private:
        Tree* tree;
        node* leftnode;
        node* rightnode;
};


int main(int argc, char* argv[])
 {
          int newtree[5]={0,45,67,34,24};
          node<int>* node1= new node<int>();
          node1->newnode(&newtree[0]);

    for(int i=1; newtree[i]>0; i++)
    {
      node1->insert(node1, &newtree[i]);
    };  
    return 0;
 }

Я не могу понять, в чем проблема, у меня никогда не было этой ошибки раньше. Проблема с кодировкой или что-то другое? Был бы очень признателен за понимание


person Skyward    schedule 30.11.2016    source источник
comment
Что именно говорит компилятор (связанный в данном случае)?   -  person Bartosz Przybylski    schedule 30.11.2016
comment
@Skyward Конечно, ld также дал вам более подробное сообщение об ошибке?   -  person Biffen    schedule 30.11.2016
comment
Может быть, это недостающий деструктор?   -  person Biffen    schedule 30.11.2016
comment
@Bartosz: это точное сообщение   -  person Skyward    schedule 30.11.2016
comment
@Biffen: Нет, или, может быть, я не знаю, где искать. C:\Users\HnH\AppData\Local\Temp\ccZUO5h8.o:Complete Binary tree.cpp:(.text$_ZN4nodeIiE6insertEPS0_Pi[_ZN4nodeIiE6insertEPS0_Pi]+0x11e): неопределенная ссылка на `node‹int›::~node()' collect2.exe: ошибка: ld вернул 1 статус выхода   -  person Skyward    schedule 30.11.2016
comment
@Skyward Сообщение действительно об отсутствующем деструкторе.   -  person Biffen    schedule 30.11.2016
comment
Есть деструктор.   -  person Skyward    schedule 30.11.2016
comment
@Skyward Нет, есть определение деструктора, но нет реализации.   -  person Biffen    schedule 30.11.2016
comment
@Skyward, поскольку @Biffen сказал об отсутствующем деструкторе, измените ~node(); на ~node() {} или ~node() = default;   -  person Bartosz Przybylski    schedule 30.11.2016
comment
Вот и сделал, просто добавил реализацию. Спасибо :):)   -  person Skyward    schedule 30.11.2016
comment
Используйте бесплатный программный компилятор, например GCC или Clang и скомпилируйте в командной строке все предупреждения и отладочную информацию (например, g++ -Wall -g). Подробнее о make   -  person Basile Starynkevitch    schedule 30.11.2016
comment
Возможный дубликат ошибка компиляции C: Id возвратил 1 статус выхода   -  person Raams    schedule 30.11.2016


Ответы (1)


Компоновщик жалуется на отсутствие определения деструктора.

Изменять

node();

to

~node() {}

или, если вы используете С++ 11

~node() = default;

Вам также необходимо освободить используемую память в деструкторе с помощью оператора delete.

person Bartosz Przybylski    schedule 30.11.2016
comment
Спасибо, что решили это так быстро. Мне просто удалить указатели? - person Skyward; 30.11.2016
comment
Если node является единственным владельцем этих указателей, то да. В противном случае прочитайте о владении в С++, например, здесь: stackoverflow.com/questions/94227/ - person Bartosz Przybylski; 30.11.2016