函数超出范围后,C ++对象数据被清除干净

问题描述 投票:1回答:1

CS学生在这里,第一篇文章。

我正在处理两个对象。 obj1通过引用传递给obj2obj2处理文件中的数据并将信息写入obj1中的char []。然后obj1评估char数组中的信息。

但是,只要obj2中写入char []的函数超出范围,所有已写入的信息都将被清除。我已经介入了代码,我很清楚obj1没有通过引用传递,但我无法弄清楚为什么。任何人都可以帮我看看我错过了什么?

int main(int argc, char* argv[])
{
    //...
    Object1 obj1;   // obj1 created with &1
    Object2 obj2(filename, obj1);
    obj2.func1();   // void function that writes to obj1.arr -> writes fine but to a obj1.arr @ &2
    obj1.func1();   // obj1.arr @ &2 is gone, obj1.arr @ &1 is garbage.
}

// Object1.h
class Object1
{
    Object1() = default;
    char arr[size];
}

// Object2.h
class Object2 
{
    public: 
        Object1 obj1;
        string filename;
}

// Object2.cpp
Object2::Object2(string filename, Object1& obj1)
    : filename(filename), obj1(obj1)
{
}
c++ scope pass-by-reference
1个回答
1
投票

我想你的问题可能在这里:

// Object2.h
class Object2 
{
    public: 
       Object1 obj1;

请注意,Object2有一个名为obj1的成员变量,并且您的Object2构造函数正在使用作为参数传递给构造函数的引用初始化该成员变量:

 Object2::Object2(string filename, Object1& obj1)
    : filename(filename), obj1(obj1)
 {

另请注意,obj1(obj1)的含义在这里并不明显 - 您已经命名了第二个构造函数参数obj1,但您还有名为obj1的本地成员变量。为了避免人类读者的歧义,您应该更改参数的名称或成员变量的名称。

您可能还想将Object2类的成员变量的类型从Object1更改为Object1 &,如果您的意图是Object2对象应该继续直接引用原始obj1对象而不是使用自己单独的Object1成员对象。

© www.soinside.com 2019 - 2024. All rights reserved.