我对C ++很陌生,我试图将对象存储在std :: vector中,如下所示:
Event.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;
}
}
Visitor.h:
//visitor.h
class Visitor
{
public:
Visitor();
Visitor(std::string name);
~Visitor();
std::string getName() const;
void listVisitors();
private:
std::string m_name;
};
Visitor.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时遇到了一些错误。当然,我相应地更改了班级成员的声明。
如何使成员和成员函数的适当声明能够使其起作用?
答案 0 :(得分:2)
从风格上讲,如果你传递指针,只需接受指针作为函数参数。
上面的示例代码中发生的事情是,访问者被复制成函数参数,并且您拥有的指针未被主函数之外的任何内容所引用。
我不能说你所看到的错误是什么,因为你没有描述它们,但它可能与不兼容的类型有关。
只是摆脱new
,因为对于这些数据结构,它们是不必要的。
int main()
{
Event e1("Whatever");
Visitor v1("Dummy1");
Visitor v2("Dummy2");
e1.addVisitor(v1);
e1.addVisitor(v2);
}
我建议如果你不知道如何使用指针你不可能想要存储它们(当按值复制工作时,它们是存储在向量中的麻烦的IMO)。
编译器生成的复制构造函数应该可以正常工作。
答案 1 :(得分:1)
不需要手动深层复制,因为您正确使用支持RAII的std::string
。
但是,您的main
函数有三次内存泄漏 - 无论如何都不需要使用new
,所以根本不需要。
一般经验法则:
如果在任何时候 T ,您正在考虑在代码中引入更多指针,那么您可能会走错方向。