类不会通过引用传递
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(¤tDirectory)
您的简化示例之所以有效,是因为您实际上并没有分配给按值传递的变量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);
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?