【问题标题】:copy one object data to another object of te same type c++将一个对象数据复制到另一个相同类型的对象 c++
【发布时间】:2013-07-16 07:39:56
【问题描述】:

嗯,我知道这是一个已经写过的问题,我遵循了几个解释,但我似乎仍然没有运气。可能有我在搜索过程中没有看到的解释,或者我做错了什么。

我创建了一个图表,我正在尝试将数据从一个图表复制到另一个图表。这很管用。但是我无法将它们分开。

graph_maker temp_graph;
temp_graph = kruskal_graph;
for(unsigned int j = 0; j < min_edges.size(); j++){
    temp_graph.add_undirected_edge(min_edges[j].node1, min_edges[j].node2, min_edges[j].edge_dist);
    if(check_cycle(temp_graph) == true)
        temp_graph = kruskal_graph;
    else
        kruskal_graph = temp_graph;
}

temp_graphkruskal_graph 是同一类型,称为 graph_maker。当我执行add_undirected_edge() 函数时,边缘被添加到两个对象中。为了使它们分开,我尝试为graph_maker 类重载赋值运算符:

    graphmaker& operator=(const graphmaker& Other)
    {
      v_map = Other.v_map;
      return *this;
    }

v_map 是包含我需要的数据的结构。我还尝试了以下方法:

    graphmaker& operator=(graphmaker other)
    {
        using std::swap;
        swap(v_map, other.v_map);
        return *this;
    }

但是这些技术都没有将两个对象分开。对于两者,当我添加边缘时,它会在 for 循环之后的第一行添加到两者。我觉得我犯了一些简单的错误,但我很难找出原因。

感谢您的意见。

编辑:

struct vertex
{
        vector <pair<float,vertex*>> adj; //cost of edge, destination vertex
        string name;
        vertex(string s){
            name=s;
        }
};

class graphmaker
{
    public:
        /*
        graphmaker& operator=(graphmaker other)
        {
            using std::swap;
            swap(v_map, other.v_map);
            // repeat for other member variables;
            return *this;
        }*/

        graphmaker& operator=(const graphmaker& Other)
        {
          v_map = Other.v_map;
          return *this;
        }

        //typedef map<string, vertex *> map;
        map<string, vertex *> v_map;
        void add_vertex(const string&);
        void add_directed_edge(const string& from, const string& to, float cost);
        void add_undirected_edge(const string& node1, const string& node2, float cost);
        void make_graph(const string& name);
};

【问题讨论】:

    标签: c++ operator-overloading deep-copy


    【解决方案1】:

    为了深度复制包含动态分配元素的复杂数据结构,您需要使用new 初始化每个动态成员以保持它们分开。因此,如果您有一些节点(顶点)指针,则需要使用new 为新对象初始化它们。

    【讨论】:

    • 当你说每个动态成员都用新的。对于这种情况,它只是 v_map,对吗?我的图目前是一个顶点图(v_map),我的每个顶点都包含顶点名称和一个包含连接目标顶点和权重的对向量。
    • @user2427671,是的,你需要用new初始化v_map中的所有顶点指针,然后你可以使用这些new指针构造成员adj。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多