班级不会通过引用传递

时间:2015-07-23 18:45:39

标签: c++ class reference

以下代码正在打印出来343.我不明白为什么它不会通过引用接收currentDirectory并更新它指向根实例的子目录的内容。

我希望它输出344。

#include <iostream>

using namespace std;

class Directory;

struct Node{
    Node* prev;
    Node* next;
    Directory* data;
};

class Directory{
    public:
        int testValue;
        Node* subDirectories;

        void addSubdirectory(int testValue){
            Directory* newDirectory = new Directory(testValue);

            Node* elem = new Node;
            elem->prev = NULL;
            elem->data = newDirectory;

            elem->next = NULL;
            subDirectories = elem;
        }

        Directory(int x){
            testValue = x;
        }
};

void testFunction(Directory* x){
    x = x->subDirectories->data;
    cout << x->testValue;
}

int main(){
    Directory* root = new Directory(3);
    root->addSubdirectory(4);

    Directory* currentDirectory = root;

    cout << currentDirectory->testValue;

    testFunction(currentDirectory);

    cout << currentDirectory->testValue;
}

我尝试了一个运行良好的简化示例:

#include <iostream>

using namespace std;

class Directory;

class Directory{
    public:
        int testValue;

        Directory(int x){
            testValue = x;
        }
};

void testFunction(Directory* x){
    x->testValue = 4;
    cout << x->testValue;
}

int main(){
    Directory* root = new Directory(3);

    Directory* currentDirectory = root;

    cout << currentDirectory->testValue;

    testFunction(currentDirectory);

    cout << currentDirectory->testValue;
}

按预期打印出344。这个是通过引用传递它。

3 个答案:

答案 0 :(得分:0)

您正在制作Directory*类型的副本,并将其作为参数传递给testFunction。该副本x不是对指针根的引用。

这可能是你想要的:

void testFunction(Directory* &x){
    x = x->subDirectories->data;
    cout << x->testValue;
}

或者,如果你更喜欢双指针路线:

void testFunction(Directory** x){
    (*x) = (*x)->subDirectories->data;
    cout << (*x)->testValue;
}

// the call turns into
testFunction(&currentDirectory)

您的简化示例有效,因为您实际上并未分配传递值的变量x:

void testFunction(Directory* x){
    x->testValue = 4; // assigning pointed-to value, not pointer
    cout << x->testValue;
}

长话短说,指针式也是一种类型。通过引用传递指针将获得与任何其他类型相同的更改。

答案 1 :(得分:0)

您的问题是您通过值而非参考。正在传递给&#34; testfunction()&#34;的实例是&#34; currentDirectory&#34;这是一个指向对象的指针。因此,如果您打算通过引用传递,它应该是这样的:

void testFunction(Directory* &x){
    x = x->subDirectories->data;
    cout << x->testValue;
 }

答案 2 :(得分:0)

或者,您可以创建类的对象而不是指针。注意,这将要求您添加一个复制构造函数(希望是一个析构函数,并重载operator =)。

Directory root(3);
root.addSubdirectory(4);

//Assuming you overload operator=
Directory currentDirectory = root;

cout << currentDirectory.testValue;

testFunction(currentDirectory);

其中

void testFunction(Directory & x);