试图将对象存储在向量中
Posted
技术标签:
【中文标题】试图将对象存储在向量中【英文标题】:Trying to store objects in a vector 【发布时间】:2013-01-21 17:46:47 【问题描述】:我对 C++ 很陌生,我正在尝试将对象存储在 std::vector 中,如下所示:
事件.h:
//event.h
class Event
public:
Event();
Event(std::string name);
~Event();
void addVisitor(Visitor visitor);
private:
std::vector<Visitor> m_visitors;
;
Event.cpp:
//event.cpp
Event::Event() :
m_name("Unnamed Event")
Event::Event(std::string name) :
m_name(name)
void Event::addVisitor(Visitor visitor)
this->m_visitors.push_back(visitor);
void Event::listVisitors()
std::vector<Visitor>::iterator it;
for(it = this->m_visitors.begin();it != this->m_visitors.end(); ++it)
std::cout << it->getName() << std::endl;
访问者.h:
//visitor.h
class Visitor
public:
Visitor();
Visitor(std::string name);
~Visitor();
std::string getName() const;
void listVisitors();
private:
std::string m_name;
;
访问者.cpp:
//visitor.cpp
Visitor::Visitor() :
m_name("John Doe")
Visitor::Visitor(std::string name) :
m_name(name)
std::string Visitor::getName() const
return m_name;
main.cpp:
//main.cpp
int main()
Event *e1 = new Event("Whatever");
Visitor *v1 = new Visitor("Dummy1");
Visitor *v2 = new Visitor("Dummy2");
e1->addVisitor(*v1);
e1->addVisitor(*v2);
如果我这样做,我将不得不添加一个复制构造函数,该构造函数将进行深层复制,以便将对象正确复制到向量中。我正在寻找一种解决方法,只将指向对象的指针存储在向量中。
我已经用std::vector<std::unique_ptr<Visitor> > m_visitors
尝试过了,但是在main.cpp 中调用addVisitor 时出现了一些错误。当然,我相应地更改了班级成员的声明。
成员和成员函数的适当声明如何使其工作?
【问题讨论】:
m_visitors.push_back(visitor)
不起作用吗?我也是 C++ 的菜鸟,我最近创建了一个程序,它使用几乎相同的语法来实现相同的目标,并且运行良好。
为什么你认为你需要添加一个拷贝构造函数?编译器提供的应该做的很好。你应该做的是摆脱main()
中的所有new
s。
std::string
和 std::vector
已经做了正确的事情。您无需添加任何内容。不过,您可能希望删除对指针和new
的使用。它们不是必需的。
@juanchopanza 因为对象被从主作用域复制到向量,不是吗?我像发布的那样尝试了它,但是 listVisitors 只给了我空行(它没有复制 m_name 的值),在我添加了一个复制构造函数之后它就可以工作了。但我不想每次更改班级成员时都必须更改 cctor
如果你的真实代码看起来和这篇文章中的一样,那么你不需要添加和复制构造函数、赋值运算符或析构函数。编译器提供的这些版本将适当地复制、分配、销毁。
【参考方案1】:
从风格上讲,如果您传递指针,只需接受指针作为函数参数即可。
上面的示例代码中发生的情况是,访问者被复制为函数参数,而您拥有的指针未被主函数之外的任何东西引用。
我无法说出您看到的错误是什么,因为您没有描述它们,但它可能与不兼容的类型有关。
只需去掉 new
s,因为对于这些数据结构,它们是不必要的。
int main()
Event e1("Whatever");
Visitor v1("Dummy1");
Visitor v2("Dummy2");
e1.addVisitor(v1);
e1.addVisitor(v2);
我建议,如果您不知道如何使用指针,那么您不可能想要存储它们(当按值复制工作正常时,将它们存储在向量中是 IMO 的麻烦)。
编译器生成的复制构造函数应该可以正常工作。
【讨论】:
【参考方案2】:不需要手动深拷贝,因为您使用std::string
非常正确,它支持RAII。
但是,您的 main
函数存在三个内存泄漏 - 无论如何都不需要在那里使用 new
,所以干脆不要。
一般经验法则:
如果在任何时候T,您正在考虑在代码中引入更多指针,那么您可能走错了方向。
【讨论】:
以上是关于试图将对象存储在向量中的主要内容,如果未能解决你的问题,请参考以下文章