Копировать конструктор для указателей на объекты

У меня проблема с написанием конструктора копирования для указателей на объекты. это точно моя проблема

У меня есть класс 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>);
        }
    }
};

// ПРЕДПОЛОЖИМ, ПРИСУТСТВУЕТ КЛАСС B, КОТОРЫЙ ТОЛЬКО ИМЕЕТ ТИП ЗНАЧЕНИЯ И НЕ ТРЕБУЕТСЯ ПОЛЬЗОВАТЕЛЬСКИЙ КОНСТРУКТОР КОПИРОВАНИЯ.

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 я не вижу вызываемой функции конструктора копирования или оператора присваивания.

Элемент указателя в классе, для которого необходимо создать глубокую копию, прост. Меня смущает, когда указатель объявляется в каком-то другом классе, объект которого используется в классе, для которого необходимо создать глубокую копию.

Может ли кто-нибудь подсказать, как сделать глубокую копию в приведенном выше случае?


person Ajai    schedule 05.04.2011    source источник


Ответы (2)


Указатель на объект не является заостренным объектом — это просто его адрес. Вы можете думать об этом как о ссылке на объект. Копирование указателя не будет копировать объект - вы всегда должны делать это явно, например. вызов конструктора копирования

G1<string,string>* g2= new G1<string,string>(g1);

Итак, нет ли у меня возможности создать два указателя для класса G1 и скопировать один в другой, удалить первый и сохранить последний? Нет ли конструкторов копирования, которые можно было бы написать в этой ситуации?

Если вы хотите получить новую копию класса с каждым указателем на него (не знаю, для чего вы могли бы его использовать, но почему бы и нет;), то вы можете сделать это, как указано выше, или написать какой-то класс, подобный указателю, который копирует объект при копировании указателя - я не думаю, что это готовая библиотека, реализующая такое поведение. Если вы хотите использовать один и тот же объект, независимо от того, сколько указателей вы создали для него, вам следует рассмотреть std::auto_ptr или аналогичные классы интеллектуальных указателей из других библиотек. Умные указатели освобождают объект для вас, поэтому вам вообще не нужно вызывать удаление.

person j_kubik    schedule 06.09.2011
comment
Спасибо за ответ. Я нашел способ справиться с этой проблемой. Технически мой вопрос неверен. Нельзя создать конструктор копирования для указателя. Вопрос не имеет смысла. Когда я читаю это сейчас, это слишком глупо для меня. Извините, однако, за такой ламерский вопрос. Я подумал о новых и удаляемых вещах для указателей. Спасибо за ответ. - person Ajai; 07.09.2011

Вы не можете создать «конструктор для указателя», но вы можете создать класс, который действует как указатель, и использовать его вместо этого. Они называются «умными указателями», и это достаточно большая тема, которую я не могу учите все здесь. Но в стандартной библиотеке есть простой класс с именем auto_ptr, о котором вам следует прочитать, а библиотека boost также содержит несколько классов интеллектуальных указателей. Вы хотите использовать их вместо «настоящих» указателей.

person Ernest Friedman-Hill    schedule 05.04.2011
comment
Итак, нет ли у меня возможности создать два указателя для класса G1 и скопировать один в другой, удалить первый и сохранить последний? Нет ли конструкторов копирования, которые можно было бы написать в этой ситуации? - person Ajai; 05.04.2011
comment
Не реальные указатели, нет. В этом вся цель этих умных указателей. - person Ernest Friedman-Hill; 05.04.2011