2015-04-11 2 views
0
class A{ 
    Add(const B&); 
    vector <B*> vect; 
}; 

A & A::Add(const B& obj){ 
    vect.push_back(&obj); 
    return *this; 
} 

здесь я получаю fpermissive ошибку, потому что аргумент push_back постоянный, как я могу избавиться от этого?ошибка при добавлении в вектор указателей

Я пытался создать локальную копию в Add таких как

B tmp; 
tmp = obj; 
vect.push_back(&tmp); 

, но я не уверен, что это, как шаг программы из этого метода Add, TMP получает уничтожена, и адрес в векторе будет указывать на недействительный место в памяти?

+0

Вы уверены, что хотите сохранить указатели на объекты, чьи жизни вы не имеете понятия? – fredoverflow

ответ

3

Ваша проблема возникает из-за несоответствия API. 2 варианта здесь:

  • уронить const с подписью Add: Add(B&)
  • магазин const B* указатели в векторе: vector<const B*> vect;

Первый вариант позволит изменять содержимое ваших объектов в то время как второй запретит это. Выбор зависит от вашей логики программы.

+0

если я использую второй вариант, что именно делает вектор vect; имею в виду ? будет ли он вести себя как нормальный вектор? – lllook

+0

@lllook Это означает, что вектор будет хранить указатели на неизменяемые объекты, т. Е. Вы не сможете изменять эти объекты. Важно различать способность изменять вектор, изменяя указатели, хранящиеся внутри, до способности изменять заостренные объекты. Вы сможете сделать первое, а не последнее. – SomeWittyUsername

+0

спасибо, это похоже на эффект, который я искал – lllook

1

Ваша проблема заключается в том, что если вы предоставляете ссылку на const как параметр функции Add, вы сообщаете компилятору, что все, что вы проходите, никогда не будет изменено как эффект этой функции. С другой стороны, вы пытаетесь сохранить указатель не константы в векторе, что означает, что пользователям этого вектора разрешено изменять значение, скоррелированное этому указателю. Чтобы избавиться от ошибки, вы должны решить, какой тип поведения вы действительно хотите от своей программы: , если вы хотите хранить ссылки только на чтение для ваших объектов «B», тогда вы должны хранить их как указатель const в вектор. Если вы хотите, чтобы пользователи этого вектора могли использовать неконстантные функции из B, то есть для изменения B, вы должны передать его функции Add как неконстантную ссылку.

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