Pointers 复制指向对象的指针的构造函数

Pointers 复制指向对象的指针的构造函数,pointers,visual-c++,vector,copy-constructor,std-pair,Pointers,Visual C++,Vector,Copy Constructor,Std Pair,我在为指向对象的指针编写复制构造函数时遇到问题。 这正是我的问题 我有一个类G1,它有一个对象s1作为它的私有数据成员。这是一个结构的对象 结构由一个向量组成 现在,当我为G1创建指针时,一切都很好 当我试图将此指针复制到同一类的另一个新指针时,它正在进行浅复制 因此,当我试图删除第一个指针时,第二个指针将丢失其引用 我的代码是这样的 template <typename T,typename V> class G1{ private: S<typename T>

我在为指向对象的指针编写复制构造函数时遇到问题。 这正是我的问题

我有一个类G1,它有一个对象s1作为它的私有数据成员。这是一个结构的对象

结构由一个向量组成

现在,当我为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.
}
有什么建议吗。 在执行指针赋值时,会调用复制构造函数吗?在VisualStudio中调试时,我无法看到调用任何复制构造函数或赋值运算符函数

需要为其创建深度副本的类中的指针成员很简单。当指针在另一个类中声明时,我感到困惑,该类的对象正在需要为其创建深度副本的类中使用


在上述情况下,有人能提供一些关于如何创建深度副本的提示吗?

您不能为指针创建构造函数,但您可以创建一个类似指针的类,并使用它。它们被称为智能指针,这是一个足够大的主题,我不能在这里教所有的东西。但是在您应该阅读的标准库中有一个名为auto_ptr的简单类,boost库还包含许多智能指针类。您希望使用这些指针,而不是“真实”指针。

指向对象的指针不是指向对象的指针,它只是它的地址。你可以把它看作是对一个对象的引用。复制指针不会复制对象-您必须使其始终显式(例如调用复制构造函数)

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

所以,我没有办法为G1类创建两个指针,并将其中一个复制到另一个,删除前者,然后仍然保留后者吗?在这种情况下是否没有可以编写的复制构造函数

如果你想得到一个新的类副本,每个指针指向它,不知道你可以用它做什么,但为什么不;然后你可以像上面那样做,或者编写一些类似指针的类,在复制指针上复制对象——我不认为theter是实现这种行为的现成库。
如果你想使用同一个对象,不管你给它创建了多少指针,那么你应该考虑STD::AutoTypTR或类似的智能指针类。智能指针将为您释放对象,所以您根本不需要调用delete。

所以我没有办法为G1类创建两个指针,并将其中一个复制到另一个,删除前者,然后保留后者吗?在这种情况下没有可以编写的复制构造函数吗?不是真正的指针,没有。这就是这些智能指针的全部目的。谢谢你的回复。我想出了解决这个问题的办法。从技术上讲,我的问题是错误的。无法为指针创建副本构造函数。这个问题毫无意义。当我现在读它的时候,它对我来说太愚蠢了。很抱歉问了这么一个蹩脚的问题。我想到了新的和删除指针的东西。谢谢你的回复。