尝试将对象存储在向量中 我是C++的新手,我想把对象存储在一个STD::vector中,像这样:

尝试将对象存储在向量中 我是C++的新手,我想把对象存储在一个STD::vector中,像这样:,c++,C++,事件h: //event.h class Event { public: Event(); Event(std::string name); ~Event(); void addVisitor(Visitor visitor); private: std::vector<Visitor> m_visitors; }; Visitor.cpp: //visitor.cpp Visitor::Visitor() : m_name("J

事件h:

//event.h
class Event
{
public:
    Event();
    Event(std::string name);
    ~Event();
    void addVisitor(Visitor visitor);

private:
    std::vector<Visitor> m_visitors;

};
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 m_visitors
中尝试过了,但是在main.cpp中调用addVisitor时出现了一些错误。当然,我也相应地修改了班级成员的声明。
成员和成员函数的适当声明如何使其工作?

从风格上讲,如果传递指针,只接受指针作为函数参数

在上面的示例代码中,访问者被复制成函数参数,而您拥有的指针没有被主函数之外的任何东西引用

我无法说明您看到的错误是什么,因为您没有描述它们,但这可能与不兼容的类型有关

只需去掉新的,因为对于这些数据结构,它们是不必要的

int main()
{
    Event e1("Whatever");
    Visitor v1("Dummy1");
    Visitor v2("Dummy2");

    e1.addVisitor(v1);
    e1.addVisitor(v2);
}
我建议,如果您不知道如何使用指针,您可能不想存储它们(在我看来,当按值复制工作正常时,将它们存储在向量中很麻烦)


编译器生成的复制构造函数应该可以正常工作。

不需要手动深度复制,因为您使用的是支持的
std::string

但是,您的
main
函数有三个内存泄漏-无论如何都不需要在那里使用
new
,所以不要这样做


一般经验法则:


如果在任何时候,您正考虑在代码中引入更多指针,那么您可能走错了方向。

是否对访问者进行了访问。
向后推(访问者)
不起作用?我也是C++的NoOB,最近我创建了一个程序,它使用几乎相同的语法来完成同样的目标,而且很好。为什么你认为你需要添加一个拷贝构造函数?编译器提供了一个应该做得很好。你应该做的是去掉
main()
std::string
中的所有
new
s,并且
std::vector
已经做了正确的事情。你不必添加任何内容。不过,您可能希望删除指针和
new
的使用。它们不是必需的。@juanchopanza因为对象从主作用域复制到向量,不是吗?我试过了,就像我发布的一样,但是listVisitors只给了我空行(它没有复制m_name的值),在我添加了一个复制构造函数之后,它就工作了。但是我不想每次我更改Classic的成员时都要更改cctor如果您的真实代码与本文中的代码类似,那么您不需要添加和复制构造函数、赋值运算符或析构函数。编译器提供了相应的复制、分配和销毁版本。
//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);
}
int main()
{
    Event e1("Whatever");
    Visitor v1("Dummy1");
    Visitor v2("Dummy2");

    e1.addVisitor(v1);
    e1.addVisitor(v2);
}