【问题标题】:Initialize member vector in constructor C++在构造函数 C++ 中初始化成员向量
【发布时间】:2013-12-08 23:10:17
【问题描述】:

我有一个类有一个类型为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);

【问题讨论】:

  • 那么这有什么问题(除了明显的拼写错误)?如果您对这种方法有什么不满意的地方,您需要告诉我们。
  • 该死,我得到了空指针异常,但现在我看到我在初始化之前使用了向量。如果你几天不睡觉,就会发生这种情况。 @polka 老实说,我没有太多使用 c++,所以我使用了这个规则:“在每个非原始变量之前添加一个 *,它会像 Java 一样工作”,至少就我的经验而言。我知道这很粗鲁……谢谢你的回答
  • “在每个非原始变量之前添加一个 *,它将像 Java 一样工作” 是一个糟糕的规则。它不会像 Java 那样工作,因为 C++ 没有本机垃圾收集器。
  • 还不错……但我对 Java 很熟悉

标签: c++ class vector initialization member


【解决方案1】:

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

另外,为什么有一个指向向量的指针呢?您是否担心将其复制到构造函数中很昂贵?

将成员更改为向量:

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.

【讨论】:

  • 如果我以后需要它,为什么还要有人删除它?当我不再使用 A 类时,GC 会删除它,不是吗?
【解决方案2】:

您的 cpp 文件中有错误,您缺少第二个冒号:

A::A() {

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

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

对于指针等原始类型使用它并没有任何真正的优势,但它是一个很好的约定。这回答了你的问题了吗?根据您的帖子,我不清楚确切的问题是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2011-05-02
    • 2023-03-14
    相关资源
    最近更新 更多