【问题标题】:Copy Constructor for pointers to objects对象指针的复制构造函数
【发布时间】:2011-04-05 02:09:20
【问题描述】:

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

我有一个类 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 中调试时,我看不到任何复制构造函数或赋值运算符函数被调用。

类中需要为其创建深拷贝的指针成员很简单。当指针在某个其他类中声明其对象在需要为其创建深拷贝的类中使用时,我感到困惑。

有人可以提供一些关于如何在上述情况下进行深层复制的提示吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果你想用每个指向它的指针获取类的新副本(不知道你能用它做什么,但为什么不呢;)那么你可以这样做,或者编写一些类似指针的类来复制对象关于复制指针 - 我不认为 theter 是实现这种行为的开箱即用库。 如果您想使用同一个对象,无论您创建了多少指针,您都应该考虑使用 std::auto_ptr 或其他库中类似的智能指针类。智能指针会为你释放对象,所以你根本不需要调用 delete。

    【讨论】:

    • 感谢您的回复。我想出了解决这个问题的方法。从技术上讲,我的问题是错误的。不能为指针创建复制构造函数。这个问题没有意义。当我现在读它时,它对我来说太愚蠢了。不过很抱歉问了这么一个蹩脚的问题。我想出了指针的新和删除东西。感谢您的回复。
    【解决方案2】:

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

    【讨论】:

    • 那么我有没有办法为 G1 类创建两个指针并将一个复制到另一个并删除前者而仍然有后者?在这种情况下是否没有可以编写的复制构造函数?
    • 不是真正的指针,没有。这就是这些智能指针的全部目的。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 2010-10-21
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多