【发布时间】: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()中的所有news。 -
std::string和std::vector已经做了正确的事情。您无需添加任何内容。不过,您可能希望删除对指针和new的使用。它们不是必需的。 -
@juanchopanza 因为对象被从主作用域复制到向量,不是吗?我像发布的那样尝试了它,但是 listVisitors 只给了我空行(它没有复制 m_name 的值),在我添加了一个复制构造函数之后它就可以工作了。但我不想每次更改班级成员时都必须更改 cctor
-
如果你的真实代码看起来和这篇文章中的一样,那么你不需要添加和复制构造函数、赋值运算符或析构函数。编译器提供的这些版本将适当地复制、分配、销毁。
标签: c++