0

(Есть три смежные вопросов здесь)Избежание неосторожно копирование объектов - Техника

Один из самых противных вещей, с которыми я сталкиваюсь в C++ случайно проходя/копирование объекта, а затем интересно, почему его состояние не то, что вы ожидаете , Недавно у меня была ситуация, когда я проходил по указателю, но я не получал состояние, которое ожидал, и оказалось, что мне пришлось передать указатель по ссылке, что действительно меня бросило!

Могу ли я просто подтверждают данный такую ​​ситуацию:

MyClass x; 
AnotherClass y; 
y.passMyObjectSomewhere(x); 
. 
. 
. 
. 
//Later on x is changed and I wish to see this change in y 
x.modifyMyObject(); 

У меня есть доступные, чтобы сохранить состояние x обновленный в y следующие методы:

MyClass* x = new MyClass(); 
y.passMyObjectSomewhere(x); 
. 
. 
. 
delete x; 

или

MyClass x; 
y.passMyObjectSomewhere(&x); 

или

shared_ptr<MyClass> x(new MyClass()); 
y.passMyObjectSomewhere(x); 

1) и все вышеперечисленные варианты будут держать x обновленный в y объекта, если внести изменения в x за пределами y?


2) Изменилось ли это, если x был объектом вектора или другой коллекции STL? Или применяются те же правила?


3) Что о классе, где указатель на конструктор, присвоенного элементу данных:

class X{ 
    public: 
     X(Something* x); 

    private: 
     Something* x; 
} 

X::X(Something* &y){ 
    x = y; 
} 

Would y должны быть переданы в качестве ссылки здесь, потому что в противном случае копия указателя будет назначено? Я задаю этот вопрос из-за другого SO вопрос, я спросил здесь:

Pointer to pointer assignment isnt working

+3

Объявление 'passMyObjectSomewhere'? – gongzhitaao

ответ

1

1) Да, они должны, если хранить указатель на свой х. Но будьте осторожны в своих двух первых примерах, y, кажется, в состоянии пережить x. Указатель в y не будет знать, что объект указал будет удален, и это, безусловно, приведет к аварии:

MyClass* x = new MyClass(); 
y.passMyObjectSomewhere(x); 
. 
// update x 
y.doesSomeActionOnX(); // no crash 
delete x; 
y.doesSomeActionOnX(); // crash 

std::shared_ptr является лучшим вариантом, поскольку это делает обрабатывать совместное владение. BTW вы можете сделать:

auto x = std::make_shared<MyClass>(); 

2) Одинаковые правила везде.

3) Ваша ссылка здесь абсолютно бесполезна.

X::X(Something* y) 
{ 
    this.y = y; 
} 
+0

Что касается № 3, я неправильно прочитал что-то в вопросе SO, который я задал несколько недель назад (связанный в моем вопросе здесь)? – user997112

+0

Ваш другой вопрос был наоборот, вы хотели изменить указатель, указанный как параметр. – Johan

 Смежные вопросы

  • Нет связанных вопросов^_^