在构造函数C ++中初始化成员向量

时间:2013-12-08 23:10:18

标签: c++ class vector initialization member

我有一个类,其成员类型为vector<CCPoint>。我想在构造函数调用中初始化这个成员,怎么能实现呢?

我这样做了:

·H

class A{
    public:
        A(vector<CCPoint> *p);
    private:
        vector<CCPoint> *p;
}

的.cpp

A:A(){
    this->p = p;
}

呼叫

Vector<CCPoint> *p = new Vector<CCPoint>;
A a = new A(p);

2 个答案:

答案 0 :(得分:4)

这会泄漏内存,因为没有人删除你“新”的矢量。

另外,为什么要指向一个向量的指针?你是否担心将它复制到昂贵的构造函数中?

将成员更改为向量:

class A{
    public:
        A(vector<CCPoint> p);
    private:
        vector<CCPoint> p;
}

更改构造函数以使用初始化列表:

A:A(vector<CCPoint> newP) : p(newP){
    // Empty
}

并且这样打电话:

Vector<CCPoint> p;
A a(p);

永远不要创建一个带有“new”的对象,除非你确切知道为什么这样做,即便如此,也要重新考虑。

性能注意:是的,可能会导致矢量副本发生,具体取决于编译器的复制省略。另一种C ++ 11花式裤子解决方案是使用move:

class A{
    public:
        A(vector<CCPoint> p);
    private:
        vector<CCPoint> p;
}

A:A(vector<CCPoint> newP) : p(std::move(newP)){
    // Empty
}

Vector<CCPoint> p;
A a(std::move(p)); // After this completes, 'p' will no longer be valid.

答案 1 :(得分:0)

你的cpp文件中有一个错误,你错过了第二个冒号:

A::A() {

此外,您可以使用初始化列表直接初始化 p ,如下所示:

A::A( vector<CCPoint>* _p ) :
p( _p )
{}

并不是说将它用于像指针这样的原始类型有任何真正的优势,但这是一个很好的约定。这回答了你的问题了吗?根据你的帖子,我不清楚问题究竟是什么。