Копировать конструктор для указателей на объекты
У меня возникли проблемы при записи конструктора копирования для указателей на объекты. Это моя точная проблема
У меня есть класс G1, который имеет объект s1 в качестве своего частного члена данных. Это объект структуры.
Структура состоит из vector<pair<int,pointer to another object of a different class>>.
Теперь, когда я создаю указатель для G1, все в порядке.
Когда я пытаюсь скопировать этот указатель на другой новый указатель того же класса, он делает поверхностную копию.
Поэтому, когда я пытаюсь удалить первый указатель, второй теряет свою ссылку.
Мой код выглядит примерно так.
template <typename T,typename V>
class G1{
private:
S<typename T> s1;
public:
G1<T,V>(){}
G1<T,V>(const G1<T,V>& g2):s1(g2.s1){}
};
template<typename T>
struct S{
private:
vector<pair<int,B<T>*>> smap;
public:
S<T>(const S& st){
for(vector<pair<int,B<T>*>>::iterator it = st.getMap().begin(); it!= st.getMap().end(); it++){
B<T> bptr = new B<T>(*it->second);
smap.push_back(pair<*(it)->first,bptr>);
}
}
};
// Предположим, КЛАСС В НАСТОЯЩИЙ, КОТОРЫЙ ПРОСТО ИМЕЕТ ЗНАЧИТЕЛЬНЫЙ ТИП, И НЕТ ПОТРЕБИТЕЛЯ, КОТОРОГО ПОЛЬЗОВАТЕЛЬ определил.
void main(){
G1<string,string>* g1= new G1<string,string>;
//values loaded into g1.
G1<string,string>* g2= g1;
delete g1;
g2.display(); //Code breaks at this point since I am not able to create two pointers pointing different locations.
// I am not able to make a new copy of the smap vector which has pointers and hence the problem.
}
Любые предложения, пожалуйста. при выполнении указателей будет вызван конструктор копирования? Во время отладки в Visual Studio я не вижу, как вызывается функция конструктора копирования или оператора присваивания.
Член указателя в классе, для которого необходимо создать глубокую копию, прост. Я запутываюсь, когда указатель объявляется в каком-то другом классе, чей объект используется в классе, для которого необходимо создать глубокую копию.
Может кто-нибудь дать подсказку, как сделать глубокую копию в приведенном выше случае?
2 ответа
Указатель на объект не является указанным объектом - это просто его адрес. Вы можете думать об этом как о ссылке на объект. Копирование указателя не будет копировать объект - вы должны сделать это всегда явно, например. вызывающий копирующий конструктор
G1<string,string>* g2= new G1<string,string>(g1);
Так нет ли у меня способа создать два указателя для класса G1 и скопировать один в другой, удалить первый и все еще иметь второй? Нет ли конструкторов копирования, которые можно было бы написать в этой ситуации?
Если вы хотите получить новую копию класса с каждым указателем на него (не знаю, для чего вы могли бы использовать его, но почему бы и нет;), вы можете сделать это как указатель или написать некоторый подобный указателю класс, который копирует объект на копирующем указателе. - Я не думаю, что theter - это готовая библиотека, реализующая такое поведение. Если вы хотите использовать один и тот же объект, независимо от того, сколько указателей вы на него создали, вам следует рассмотреть std::auto_ptr или аналогичные классы интеллектуальных указателей из других библиотек. Умные указатели освободят объект для вас, поэтому вам вообще не нужно вызывать delete.
Вы не можете сделать "конструктор для указателя", но вы можете создать класс, который действует как указатель, и использовать его вместо этого. Они называются "умными указателями", и это достаточно большая тема, которую я не могу Здесь все учат, но в стандартной библиотеке есть простой класс с именем auto_ptr, о котором вы должны прочитать, и библиотека boost также содержит ряд классов интеллектуальных указателей. Вы хотите использовать их вместо "настоящих" указателей.