2016-04-05 13 views
0

(私の英語では申し訳ありません、私はウクライナ語です)私は "スタックの番号"(コンソールアプリケーション)を実現するプログラムをやっています。私はstacを削除した後で、きれいにされた動的メモリとなるデストラクタを追加したいと思うでしょう。私はデストラクタなしで私のstacを行うとき - all right、私はデストラクタを追加している - 私はerrorを持っています。デストラクタは、アプリケーションが終了すると呼び出されますが、プログラムが最初の関数を呼び出すときにエラーが発生します。デストラクタなしでは、私はこのエラーがありません。これは私のソースコードで、デストラクタはコメントアウトされています。デストラクタを追加した後、プログラムが呼び出される前にエラーが発生しました

#include<iostream> 
#include<ctime> 
using namespace std; 

struct Oneof 
{ 
int num; 
Oneof* next; 
}; 

class Stac 
{ 
private: 
Oneof * first; 
public: 
/*~Stac();*/ 
Stac(); 
Stac(Stac &n); 
void New(int n);     //Adding new element 
int Remove();     //Reading last element and removing it 
int SetLast();     //Reading last element without removing   
void Read();      //Reading all stac 
friend bool Eq(Stac a, Stac b); //Equive two another stacs 
}; 

Stac::Stac(){first=NULL;} 

Stac::Stac(Stac &n){first=n.first;} 

/*Stac::~Stac() 
{ 
    while(first!=NULL) 
    { 
     Oneof *temp=first; 
     first=first->next; 
     delete temp; 
    } 
} 
*/ 

void Stac::New(int n)     //Adding new element 
{ 
Oneof* temp=new Oneof; 
temp->num=n; 
temp->next=first; 
first=temp; 
} 

int Stac::Remove()      //Reading last element and removing it 
{ 
int a=first->num; 
Oneof *temp=first; 
first=first->next; 
delete temp; 
return a; 
} 

int Stac::SetLast()     //Reading last element without removing 
{ 
return first->num; 
} 

void Stac::Read()      //Reading all stac 
{ 
Oneof* temp=NULL; 
Oneof* save=NULL; 
save=first; 
while(first!=NULL) 
{ 
    temp=first; 
    cout<<temp->num<<" "; 
    first=temp->next; 
} 
first=save; 
} 

bool Eq(Stac a, Stac b)     //Equive two another stacs 
{ 
Oneof* tempa=a.first; 
Oneof* tempb=b.first; 
while(tempa!=NULL && tempb!=NULL) 
{ 
    if(tempa->num==tempb->num) 
    { 
     tempa=tempa->next; 
     tempb=tempb->next; 
    } 
    else return false; 
} 
if(tempa==NULL && tempb==NULL)return true; 
else return false; 
} 

int main() 
{ 
Stac a; 
srand(time(0)); 
for(int i=0; i<10; i++) 
    { 
     a.New(rand()%100); 
    } 
Stac b(a); 

cout<<"Chek equive...\n"; 
bool equ=Eq(a,b); 
if(equ==0)cout<<"First!=Second\n"; 
else cout<<"First==Second\n"; 

cout<<"\nReading without removing first number of fisrt stac...\n"; 
int n=a.SetLast(); 
cout<<n<<endl; 

cout<<"\nReading first Stac...\n"; 
b.Read(); 

cout<<"\n\nReading second Stac...\n"; 
a.Read(); 

cout<<"\n\nAdding new number and reading first Stac...\n"; 
b.New(rand()); 
b.Read(); 

cout<<"\n\nRemoving number and reading second Stac...\n"; 
int last=a.Remove(); 
cout<<last<<endl; 
a.Read(); 

cout<<"\n\nChek equive...\n"; 
bool equ1=Eq(a,b); 
if(equ1==0)cout<<"First!=Second\n\n"; 
else cout<<"First==Second\n\n"; 

system("pause"); 
return 0; 

}

+0

あなたのコピーコンストラクタでオブジェクトを渡すために、それはありません、既定のコピーコンストラクタ*(あなたが行うように)浅い*コピーよりも異なるません。 –

答えて

2

あなたの機能Eqしたがってabがあなたの入力の機能ローカルコピーになります

bool Eq(Stac a, Stac b) 

で2つのStacオブジェクトをとります。したがって、関数が終了した後、スコープから外れ、デストラクタが呼び出されます。やっと何かをコピーし、ローカルコピーを作成することを避けるconst&

bool Eq(Stac const& a, Stac const& b) 
+0

どちらか、または適切なコピーコンストラクタを実装してください(これは長期的にはより良い解決策ですが、IMHO)。 –

+0

関数シグネチャを前述の2番目の方法( 'const&'を渡す)に変更することができます。また、@ JoachimPileborgがあなたのコピーコンストラクタが正しく書かれていないと述べたので、それは最初のアイテムだけをコピーするだけで、すべてのアイテムのディープコピーを作成する必要があります。 – CoryKramer

+0

ありがとう、私は理解した。私のcope-conctructorが間違っているので、最初のStacから要素を削除すると、この要素も2番目のStacからも削除されます。そして、このために、デストラクタは1つのStacだけの要素を削除することができ、別の要素から要素を削除しようとするとエラーが表示されます。 – Manbass

関連する問題