当涉及到类对象的指针的矢量时,我很难编写三个规则。 搜索过的示例似乎并不适用。 我有以下三个课程:

class Data
{
    private:
        map<string, double> m_DataVariables;

    public:
        Data();
        Data(const Data &data);
 };

class Sample
{
    private:
        Data *m_pData;

    public:
        virtual ~Sample()
        {
            delete m_pData;
        }

    Sample();
    Sample(const Sample &sample);
};

class BuildTree
{
    private:
        vector<Sample*> BuildSamples;

    public:
        BuildTree(vector<Sample*> &Samples);

        // This does not compile
        BuildTree(const BuildTree& other) : BuildSamples(new(other.BuildSamples))
        {
        } 

        ~TreeBuilding()                                         
        {   
            for (int i = 0; i < BuildSamples.size(); ++i)
                delete BuildSamples[i];
        }

        void BuildTrees(void);
};

1-不确定我是否正确删除BuildSamples。

2-在构造函数中,要对传递的参数进行深拷贝到成员变量BuildSamples中。

BuildTree::BuildTree(vector<Sample*> &samples)
{
    BuildSamples = samples;  // This just copies the references
} 

如何编写复制构造函数以进行深复制? 我在这里想念什么?

3-请注意:无法访问智能指针,share_ptr或unique_ptr等。C ++ 98是我所拥有的。 请显示执行此操作所需的步骤。 真的感谢您的时间和考虑。

#1楼 票数:1

您可能想要类似的东西:

BuildTree(const BuildTree& other)
{
    BuildSamples.reserve(other.BuildSamples.size());
    for (std::size_t i = 0; i != other.BuildSamples.size(); ++i) {
        BuildSamples.push_back(new Sample(*other.BuildSamples[i]));
    }
}

BuildTree(const vector<Sample*> &samples)
{
    BuildSamples.reserve(samples.size());
    for (std::size_t i = 0; i != samples.size(); ++i) {
        BuildSamples.push_back(new Sample(*samples[i]));
    }
}

#2楼 票数:1

我注意到您将您的问题标记为 即使C ++ 98不支持std::智能指针,也可以使用Boost中定义的智能指针,例如boost::shared_ptr 例如,您可以使用vector<boost::shared_ptr<Sample>>简化代码,而不是像vector<Sample*>那样使用原始拥有的指针。

这样,复制和销毁操作将在后台自动执行。

#3楼 票数:0

您需要将BuildSamples成员初始化为指针向量,并确保每个指针都指向传递的对象的克隆。 一种方法是

BuildTree(const BuildTree& other) : BuildSamples(other.BuildSamples)
{
     std::vector<Sample *>::iterator i = BuildSamples.begin(), end = BuildSamples.end();
     while (i != end)
     {
         *i = new Sample(**i);
         ++i;
     }
}

BuildSamples(other.BuildSamples)使用BuildSamples以正确数量的元素初始化BuildSamples ,但这些元素与other.BuildSamples指针相同。 这样可以确保向量的大小正确,而不必担心显式设置大小。 那是浅表。 然后,构造函数的主体将设置BuildSamples每个元素,使其指向其自身的副本-从而完成深层副本。

构造函数BuildTree(const std::vector<Sample *> &)可以类似的方式实现。

注意:鉴于您的类正在实现一个非平凡的副本构造函数(以进行深层复制)和一个析构函数进行清理,因此您还需要实现一个赋值运算符BuildTree &operator=(const BuildTree &) 有关原因的解释,请查找“三个规则”。

#4楼 票数:0

在处理指针并避免由于调用析构函数而导致正在运行的程序崩溃时,必须使用深度复制! 深度复制允许创建指向新分配空间的新指针。 但是,当将对象作为向量中的R值传递时,最好使用move构造函数。

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    class example{
        private:
         int *pointer;
    public:
        //constructor
        example(int d){
            pointer = new int;
            *pointer = d;
            cout<<"Constructor Called"<<endl;
        }


    // deep copy
        example(const example &source){
            pointer = new int;
            *pointer= *source.pointer;
            cout<<"deep copy made"<<endl;
        }
    // Move Constructor
        example(example &&source) noexcept :pointer{source.pointer}{
        source.pointer = nullptr;
        cout << "object moved"<<endl;
        }
// Destructor
        ~example() {
            delete pointer;
            cout << "Destroyed"<<endl;
        }

    };

    int main()
    {

        vector <example> vec;
        vec.push_back(example{300});
        vec.push_back(example{300});
        vec.push_back(example{300});
        vec.push_back(example{300});
        return 0;
    }

  ask by Galan translate from so

未解决问题?本站智能推荐:

1回复

浅拷贝或深拷贝或数组

我正在尝试解决问题。 我有一个带有int数组prix的类。 如果我使用复制构造函数复制对象Test。 它会复制int数组prix的深层副本还是浅层副本? 我不能使用任何Stl容器(( 编辑:那时候我错了,那只是一个指针。 如何复制指向的数组?
3回复

矢量的深拷贝 myArr,该

为了制作myArr的深层副本, 其中Point是一个有2个int成员的类, 我需要做一些特别的事吗? 或者还可以 我需要删除otherArr一些点,但同时我需要myArr所有点以供以后使用。 提前致谢
4回复

C++ 中的“深拷贝”构造函数

我想构建一个复制构造函数Pair(const Pair& other) 。 这将以对另一个Pair的只读引用作为其参数。 它应该将新构建的Pair为“深拷贝”。 但是我不知道如何在这些新位置设置整数,应该根据另一个Pair指向的整数分配值。 class Pair { public: in
3回复

C++:更新深拷贝中的指针(高效)

我的问题最好用代码示例来说明,所以让我们从这个开始: 现在我想做的是对这个 Game 类做一个深拷贝。 我创建了一个带有新 shared_ptrs 的新向量,它指向作为原始 Card 对象副本的新 Card 对象。 那部分很容易。 那么麻烦就开始了,m_ptrs的指针要更新为指向m_cards
2回复

如何使用向量向量作为其值迭代地图?

我正在尝试编写一个函数,该函数采用“向量向量”并将它们存储在地图中。 本质上,我想将一系列 SQL 语句(值)存储在以表名作为键的映射中。 例如: - table1 键将存储所有要输出到 table1 的 sql 查询 - table2 键将存储所有要输出到 table2 的 sql 查询 到目前
1回复

迭代多个嵌套向量

想象有一个具有某些特定属性的A类向量。 其中,B具有类型B的向量。此外,B除其他外,具有类型向量的成员变量。 迭代所有给定C的最佳方法是什么? 天真的方法是使用嵌套循环。 更改类型C的对象的属性foo以禁止类似 如果我必须经常以这种方式遍历C类的所有对象, 也许身体更复杂;
2回复

将值插入向量到列表中

我有一个带有向量的特定列表。 我想为向量添加一个值。 我怎样才能做到这一点? 这是我的代码: 现在,我想向列表中的向量添加值...我尝试这样做: 我认为这会起作用。 因此,我可以遍历所有向量并插入所需的值。 但这行不通。 这里是编译器的输出:
1回复

如何修复错误初始化结构向量

这是我的代码。 (C ++ 98) 错误是 函数定义未声明参数