1

リンクリストを試しています。リストが参照渡しされていないにもかかわらず、関数「null」がリストを変更しているようです。これらの問題は、通常の値渡しパラメーターとして渡されるオブジェクトで発生する可能性があり、クラス内のデータが適切な OOP でパブリック メンバーとして宣言されない理由の 1 つであることを読みました。リストのメンバー関数として null 関数を試してみましたが、うまく機能しますが、この方法が正しく機能しない理由を理解したいと思います。ありがとう

#include <iostream>
#include <new>
#include <time.h>
#include <stdlib.h>
using namespace std;

class list{
    public:
    struct element {
    int data;
    element* next;
};

element * head;


list(){
    head=NULL;
}

~list(){
while (head!=NULL){
    element *e = head->next;
    delete head;
    head = e;
    }
    cout<<"Destructing..\n";
}

void add (int value){
    element *e = new element;
    e->data = value;
    e->next = head;
    head= e;
    }
};

void fill10 (class list & l){
    for (int i= 0; i<10 ;i++){
    l.add((rand()%10)+1);
    }
}

bool null (class list l){
    if (l.head!=NULL){ return false;}
    return true;
}


int main ()
{
    srand(time(NULL));
    class list l;
    fill10(l);

    cout<<l.head->data<<endl;
    cout<<l.head<<endl;

    cout<<endl<<null(l)<<endl;//when I comment this everything works out as expected

    cout<<l.head->data<<endl; //this data is not the same anymore after null is called
    cout<<l.head<<endl;

   return 0;
}
4

3 に答える 3

2

問題は、パラメータをnull関数に渡す方法です

bool null (class list l){
    if (l.head!=NULL){ return false;}
    return true;
}

値渡しの場合は、リンク リストのコピーを作成します。このコピーには、元のポインターと同じポインターのコピーが含まれますhead

関数が戻ると、パラメータは破棄され、そのデストラクタはオリジナルとコピーの間で共有されているすべてのノードを削除します。

参照渡しするか、コピーされたリストの新しいノードを作成するコピー コンストラクターを定義する必要があります。

于 2012-06-28T13:04:48.573 に答える
0

関数は値nullを取りますlistが、何が含まれていlistますか?これは実際には実際のもの(element)への単なるポインタです。したがって、値で呼び出すときにコピーされるのは、ものelement)ではなく、ものへのポインタです

あなたが今それを持っているように、それがそれが機能する理由です。

于 2012-06-28T13:01:34.363 に答える
0

l値を渡すnullと、コピーコンストラクターが呼び出され、コピーのはと同じheadポイントになります。このコピーがの終わりでスコープ外になると、が削除されます。これは、で使用されているものと同じです。headlnullheadheadl

C ++には「3つのルール」と呼ばれるものがあります。これは、デストラクタ、コピーコンストラクタ、または代入を定義するときは常に、それらすべてを定義する必要があることを示しています。

于 2012-06-28T13:02:29.577 に答える