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

时间:2019-03-17 05:18:50

标签: c++ scope pass-by-reference

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)
{
}

1 个答案:

答案 0 :(得分: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的本地成员变量。 。为了避免对人类读者造成歧义,您应该更改参数名称或成员变量名称。

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