1

Я учащийся в C++, и я вхожу в тему конструкторов и деструкторов. Я скомпилировал приведенный ниже код и возвращает неопределенную ссылку на Book :: ~ Book(). Но когда я комментирую деструктор, он работает нормально. Я думаю, что я могу создать функции-члены после использования деструкторов. Что я здесь делаю неправильно? Я написал свой код ниже для лучшего подчёркиванияПосле использования деструкторов код показывает «ссылка на Book :: ~ Book()» error

class Book 
{ 
private: 
    int *pages; 
    int *price; 

public: 
    Book()  //default constructor 
    { 
     pages = new int; 
     price = new int; 
     *pages = 300; 
     *price = 8; 
    }; 

    void pre_destructor() 
    { 
     std::cout << "The pages:" << *pages; 
     std::cout << "The price:" << *price; 
    } 

~Book();    //destructor 

    void post_destructor() 
    { 
     std::cout << "The pages:" << *pages << "\n"; 
     std::cout << "The price:" << *price << "\n"; 
     delete pages; 
     delete price; 
    } 
}; 

int main() 
{ 
    using namespace std; 
    Book book1; 

    cout << "Before using destructors" << endl; 
    cout << "---------------------------------"<< endl; 

    book1.pre_destructor(); 

    cout << "After using destructors" << endl; 
    cout << "---------------------------------"; 

    book1.post_destructor(); 

    return 0; 
} //destructor is called here 
+0

Добро пожаловать на ТАК! Вы забыли реализовать деструктор; '~ Book();' это просто его объявление. –

+0

Я сделал редактирование. Но теперь он показывает «ожидаемый, в конце объявления участника», указывающий на строку, где деструктор называется –

+1

. У некоторых функций очистки обычно плохой дизайн, если вам нужно их вручную называть, потому что вы можете забыть позвонить им или может возникнуть исключение. Подумайте о том, чтобы разместить их внутри своего деструктора. – user2296177

ответ

1

Ваш деструктор объявлен, но не определен.

Похоже, что «post_destructor» выполняет фактическое уничтожение. В результате все, что вам нужно сделать, это написать вам деструктор следующим образом:

~Book() {} // empty, nothing to do here... 
+0

В деструкторе есть что-то делать. Посмотрите на его участников. Он также имеет две функции, называемые 'pre_destructor()' и 'post_destructor()'. Он должен освободить память, выделенную в его конструкторе. – user2296177

+0

Да, но он уже «разрушает» в post_destructor(). Я согласен, что здесь есть указатель, но если он называет «post_destructor()» вручную, он уже удален до вызова фактического деструктора. –

+0

TBH, я не уверен, почему у него есть до и после деструктора и он не просто разрушает внутри деструктора ... –

2

Я немного сократил это. прежний void pre_destructor() был бессмыслен; это лучше всего помещено в dtor (короткое для «деструктора»), и post_destructor() было даже потенциально опасно.

#include <iostream> 

class Book 
{ 
private: 
    int *pages; 
    int *price; 

public: 
    Book() : pages(new int(300)), price(new int(8)) {} 

    ~Book() { 
     std::cout << "The pages:" << *pages << "\n"; 
     std::cout << "The price:" << *price << "\n"; 
     delete price; 
     delete pages; 
    } 
}; 

int main() 
{ 
    { 
     Book book1; 
    } //destructor is called here 

    return 0; 
} 

live в Coliru в