Данные объекта C ++ очищаются после того, как функция выходит из области видимости - PullRequest
1 голос
/ 17 марта 2019

CS студент здесь, первый пост.

Я работаю с двумя объектами.obj1 передается в obj2 по ссылке.obj2 обрабатывает данные из файла и записывает информацию в символ [] в obj1.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 Ответ

1 голос
/ 17 марта 2019

Я думаю, ваша проблема может быть здесь:

// 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 член-объект.

...