Копировать конструктор для указателей на объекты - PullRequest
0 голосов
/ 05 апреля 2011

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

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

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

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

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

0 голосов
/ 05 апреля 2011

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

...