类不会通过引用传递

Class won't pass by reference

本文关键字:引用      更新时间:2023-10-16

下面的代码打印出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。这个是通过引用传入的

您的问题是您是通过值传递而不是通过引用。传递给"testfunction()"的实例是"currentDirectory",它是指向对象的指针。因此,如果你打算通过引用传递,它应该像这样:

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

您正在复制类型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;
}

长话短说,指针指向类型本身也是一种类型。

或者,您可以创建类的对象而不是指针。注意,这将要求您添加一个复制构造函数(最好还有一个析构函数和重载操作符=)。

Directory root(3);
root.addSubdirectory(4);
//Assuming you overload operator=
Directory currentDirectory = root;
cout << currentDirectory.testValue;
testFunction(currentDirectory);

,

void testFunction(Directory & x);