以下代码正在打印出来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。这个是通过引用传递它。
答案 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(¤tDirectory)
您的简化示例有效,因为您实际上并未分配传递值的变量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);