2013-12-08 106 views
0

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

我做了这样的:

.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); 
+0

那么什么(除了明显的拼写错误)是错误的呢?如果有什么特定的东西你不喜欢这种方法,你需要告诉我们。 –

+0

该死,我得到了空指针异常,但现在我看到我在初始化它之前使用了该向量。如果你不睡几天就会发生这种情况。说实话,我还没有使用过C++,所以我使用了这个规则:“在每个非原始变量之前添加一个*,它将像Java一样工作”,至少就我所见过的而言。我知道这是无礼的...谢谢你的回答总之 –

+1

_“在每个非原始变量之前加一个*,它将像Java一样工作”_是一个可怕的规则。它不会像Java一样工作,因为C++没有本地垃圾回收器。 – Chad

回答

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); 

,永远用“新”创建一个对象,除非你确切知道你为什么这样做,即使这样,重新考虑。

性能注意:是的,这个可能会导致一个向量复制发生,这取决于编译器的复制精度。一个替代的C++ 11花式裤子解决方案将使用移动:

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. 
+0

为什么要有人删除它,如果我以后需要它?当我不再使用A类时,GC将删除它,不是吗? –

+1

没有GC。 – polkadotcadaver

0

有一个错误在你的CPP文件,你”再次错过第二个结肠:

A::A() { 

此外,您还可以使用像这样的初始化列表直接初始化p

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

不是说有任何真正的优势在使用此为基本类型,如指针,但它的好习惯。这回答了你的问题了吗?根据你的帖子,我不清楚问题是什么。

相关问题