试图将对象存储在向量中

时间:2013-01-21 17:46:47

标签: c++

我对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时遇到了一些错误。当然,我相应地更改了班级成员的声明。 如何使成员和成员函数的适当声明能够使其起作用?

2 个答案:

答案 0 :(得分:2)

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

上面的示例代码中发生的事情是,访问者被复制成函数参数,并且您拥有的指针未被主函数之外的任何内容所引用。

我不能说你所看到的错误是什么,因为你没有描述它们,但它可能与不兼容的类型有关。

只是摆脱new,因为对于这些数据结构,它们是不必要的。

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

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

我建议如果你不知道如何使用指针你不可能想要存储它们(当按值复制工作时,它们是存储在向量中的麻烦的IMO)。

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

答案 1 :(得分:1)

不需要手动深层复制,因为您正确使用支持RAIIstd::string

但是,您的main函数有三次内存泄漏 - 无论如何都不需要使用new,所以根本不需要。


一般经验法则:

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