【问题标题】:Class won't pass by reference类不会通过引用传递
【发布时间】:2015-07-23 18:45:38
【问题描述】:

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

【问题讨论】:

  • 不,它是通过指针值而不是通过引用传递。
  • 这就是我的想法,但我无法让它工作。我试过把它做成双指针和一切
  • 您是否尝试过将其作为参考?我的意思是,您的问题基本上是在询问通过引用传递
  • 在这种特殊情况下,我不知道如何将其作为参考传递。
  • 我在两个示例中都以相同的方式传递它,但在第二个示例中它有效,而在第一个示例中它没有

标签: c++ class reference


【解决方案1】:

您的问题是您是按值而不是按引用传递。传递给“testfunction()”的实例是“currentDirectory”,它是一个指向对象的指针。所以如果你打算通过引用传递它应该是这样的:

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

【讨论】:

  • 我明白了。谢谢它的工作。为什么它在我的第二个示例中起作用?
  • @DavidBandel 您的第二个示例修改了int,并且只有一个Directory 对象。但是您的第一个示例尝试修改指针并具有两个 Directory 对象。所以他们真的在做非常不同的事情。
【解决方案2】:

您正在制作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;
}

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

【讨论】:

  • 很酷,可以修复它。为什么它在我的第二个示例中起作用?
  • 已添加。指针 x 是按值传递的,x 指向的东西在技术上并不是作为参数“传递”的,x 只是告诉你它在内存中的存在位置。
【解决方案3】:

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

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

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

cout << currentDirectory.testValue;

testFunction(currentDirectory);

在哪里

void testFunction(Directory & x);

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 2012-02-14
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多