2011-04-11 125 views
1

我存储在指针这些对象的矢量的多个对象,像这样,在C++:向量含有矢量对象指针的最终指向同一对象

vector<Host *> somevector; 

我然后初始化每个项是这样的:

somevector.push_back(new Host(x)); 

该对象采用初始化参数。 正如我通过数据(字符串)读出并与对象的指针的列表中结束,我将它们添加到对象本身内部的内部向量:

somevector.at(i)->add(string data); 

然而,似乎所有的数据已被添加到同一个对象,并且即使对象具有不同的名称,它们存储此数据的内部向量也是相同的。

我搜索了各种关键字来解决这个问题,我认为这是一个复制构造函数的问题(我目前正在使用默认值)。如何解释我正在复制的对象内的矢量?我是否必须使对象中的矢量成为一个字段,以便在复制构造函数中创建一个新的矢量?

编辑:

我复制的对象类代码:

vector<string> v; 

Host::Host(string _x): x(_x) 
{ 
} 

Host::~Host() 
{ 
} 

string Host::name() 
{ 
    return x; 
} 

string Host::link(int r) 
{ 
    int i = r % v.size(); 
    return v.at(i); 
} 

void Host::add(string data) 
{ 
    v.push_back(data); 
} 

所以我使用的主机对象内这个载体来存储一串字符串。然后,当我从主程序调用链接时,我将它传递给一个随机数,并且我想从该对象内的列表中获取一个随机字符串。但是,我的link()调用返回了不应该存储到对象中的字符串。

+1

你应该向我们展示实际的代码 - 根据你给我们的信息,我们只能猜测。 – 2011-04-11 12:45:24

+3

没有看到“对象”的代码,这是不可能知道的,但你几乎肯定不应该使用原始指针。 – Puppy 2011-04-11 12:46:02

+1

一些提示:不要使用'somelist.at(i)',你可以使用'somelist [i]'。另外,这似乎是使用['boost :: ptr_vector'](http://boost.org/doc/libs/1_46_1/libs/ptr_container/doc/ptr_vector.html)的理想场景。 – 2011-04-11 12:47:56

回答

1

从我所看到的示例代码中,您发布'v'不是主机的成员对象。所以对Host :: add的调用只是简单地推回到全局可用的向量。这可能是你的问题所在吗?

+0

这似乎是问题;我想要矢量v是link()和add()虽然可以访问的矢量;我怎么能够做到这一点,而无需在文件中创建v全局? – Nordak 2011-04-11 13:14:28

+0

@Nordak:你会想让'v'成为'Host'类的成员变量。然后,每个“主机”将拥有自己的副本。 – dfan 2011-04-11 13:18:12

+1

类似以下的接口将允许添加和链接与同一'v'对话,同时为主机的每个实例保留单独的'v'。 'class Host { private: vector v; const string x; public: 主机(字符串_x):x(_x){}; 〜Host(){}; string name(); link(int r); add(string s); };' – 2011-04-11 13:25:37