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

时间:2011-04-05 02:09:20

标签: pointers visual-c++ vector copy-constructor std-pair

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

我有一个类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 :(得分:0)

你不能创建一个“指针的构造函数”,但你可以创建一个类似于指针的类,而是使用它。它们被称为“智能指针”,这是一个足够大的话题,我这里不能教一切。但是你应该阅读标准库中有一个名为auto_ptr的简单类,而且boost库也包含许多智能指针类。你想使用那些而不是'真正的'指针。

答案 1 :(得分:0)

指向对象的指针不是指向对象 - 它只是它的地址。您可以将其视为对象的引用。复制指针不会复制对象 - 您必须始终明确表示它。调用复制构造函数

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

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

如果你想获得每个指向它的类的新副本(不知道你能用它做什么,但为什么不用;)然后你可以像bove那样做或写一些类似指针的类来复制对象在复制指针 - 我不认为theter是一个实现这种行为的开箱即用的库。 如果你想使用相同的对象,无论你创建了多少指针,那么你应该考虑std :: auto_ptr或其他库中的类似智能指针类。智能指针将为您释放对象,因此您根本不需要调用删除。