(Есть три смежные вопросов здесь)Избежание неосторожно копирование объектов - Техника
Один из самых противных вещей, с которыми я сталкиваюсь в 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
Объявление 'passMyObjectSomewhere'? – gongzhitaao