2015-05-27 2 views
2

Привет, ребята, поэтому у меня проблемы с моим деструктором в моей программе на C++. Когда я запускаю программу и беру вход пользователя, она неожиданно вызывает деструктор перед cout может даже печатать внутри утверждения. Предположим, что пользовательский ввод будет одним, потому что я разработал эту часть кода только для ввода ввода 1. Я думал, что деструктор вызван, когда вы покидаете область видимости, поэтому я думал, что деструктор должен быть вызван по крайней мере после того, как cout в оператор if, который я буду комментировать ниже, чтобы вам было легче читать. Если кто-то может объяснить мою ошибку и исправить ее, это было бы здорово! В моей headerfile у меня естьПочему мой деструктор называется и как я могу его исправить?

#include <iostream> 
#include <string> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

class creature{ 
public: 
    creature();//default constructor 
    creature(int a); 
    ~creature();//desconstructor 
    string getName();//accessor for the name 
    static int getNumObjects(); 
private: 
    string name; 
    int happy_level; 
    static int count; 
}; 

В моем файле реализации у меня есть

#include "creature.h" 

int creature::count=0;//initialize static member variable 

creature::creature(){//default constructor 
    name="bob"; 
    ++numberobject; 

    cout<<"The default constructor is being called"<<endl; 
} 

creature::creature(int a) 
{ 
    if(a==1) 
    { 
     name="billybob"; 

    } 


    else if(a==2) 
    { 
     name="bobbilly"; 

    } 

    else if(a==3) 
    { 
     name="bobbertyo"; 
     happy_level=1; 
    } 
} 

creature::~creature() 
{ 
    cout<<"The destructor is now being called"<<endl; 
    cout<<creature::getName()<<" is destroyed."<<endl; 
    --count; 
    cout<<"Now you have a total number of "<<creature::getNumObjects()<<" creature"<<endl; 
} 

и в моем главном классе у меня есть

#include "creature.h" 

int main() 
{ 

    creature foo;//this is where the default constructor gets called which is good 
    int choice; 

    cout<<"enter 1 2 or 3 to choose ur monster"<<endl; 
    cin>>choice; 

    foo=creature(choice); 

    if(choice==1) 
    { 
     cout<<"hi"<<endl;//the destructor gets called before hi is printed out and I don't know why thats happening 
    } 

} 
+1

это называется «деструктор». –

+2

В 'foo = существо (выбор);' вы создаете анонимный экземпляр ('creature (choice)'), вызываете 'creature & operator = (const creature &)' на 'foo', а затем уничтожаете анонимный экземпляр. Кроме того, это «деструктор», BTW. –

+0

Ваша переменная 'count' не отражает то, что действительно происходит. Вы не смогли добавить конструктор копирования и оператор присваивания для подсчета этих экземпляров. Вместо этого вы уменьшаете количество экземпляров объектов, которые вы даже не отслеживали. – PaulMcKenzie

ответ

8

Когда вы сделаете это

foo=creature(choice); 

временный creature Объект создается на RHS задания. Его деструктор вызывается после выполнения инструкции, то есть в конце строки.

Существует на самом деле не что-нибудь, чтобы исправить, но вы можете инициализировать foo после прочтения в choice, а не по умолчанию инициализации, а затем назначение:

int choice; 

cout<<"enter 1 2 or 3 to choose ur monster"<<endl; 
cin>>choice; 

creature foo(choice); 
+0

- это не оригинальное 'существо '(' foo'), которое будет уничтожено? – Amit

+0

@Amit. Он уничтожается, когда 'main()' выходит, а не во время показанного показания. – juanchopanza

+1

@Amit Нет, это в значительной степени эквивалентно 'creature __anon (выбор); foo.operator = (__ Анон); __anon ~ существо();. '. –

1

Как juanchopanza отметил в своем ответе, линия

foo = creature(choice); 

создает временный объект существа, прежде чем назначать его foo. Если вы не хотите, чтобы это произошло, создайте его с

creature foo(choice); 
1

Чтобы добавить другие ответы, ваш вопрос касается «фиксируя деструктор». Нечего исправить, но может быть ошибка в том, что вы пытаетесь выполнить из-за вызова деструктора.

Что произойдет с вашим текущим кодом, так это то, что временные копии могут быть созданы без вашего отслеживания. Когда вызывается их деструктор, вы будете непреднамеренно уменьшать переменную count, возможно, вы получите отрицательное значение для count.

Если вы хотите, чтобы объект static count переменной-член правильно отражал количество объектов, созданных и уничтоженных, вашему классу не хватает определенного конструктора копии для отслеживания количества экземпляров.

Необходимо добавить эту функцию.

class creature{ 
public: 
    creature(const creature& c) : 
     name(c.name), happy_level(c.happy_level) { ++count; } 
}; 

Эта функция будет вызываться при копировании или назначении.

Живые примеры:

(исходный код): http://coliru.stacked-crooked.com/a/ea9821e622aa4cdc

(изменен код): http://coliru.stacked-crooked.com/a/b774a896377bdf97

Единственное отличие состоит в том, что исходный код имеет конструктор копирования закомментирована, в то время как измененный код имеет конструктор копирования неповрежденным.

Обратите внимание, что в исходном коде я хотел знать, сколько объектов создано и уничтожено, но я получил результат -1, когда последний объект был уничтожен. Это неверно, так как очевидно, что результат должен давать 0, то есть все существа уничтожаются.

Измененный код показывает правильный номер, и это связано с тем, что объект создания временного существа был учтен.

Смежные вопросы