无法为类中的变量赋值

时间:2017-10-02 19:06:41

标签: c++ class c++11 pointers

#include <iostream>

using namespace std;

class Foo {

    int i;
    int * p = new int;
    *p = 5; // This doesn't worl
    // If I instead use  int * p = new int(5); it works.
};

为什么?我看到这只发生在一个类中,如果我在主函数上编写相同的代码它应该工作。

3 个答案:

答案 0 :(得分:2)

我是在假设您需要动态分配成员的情况下编写的,并且您不能简单地将参数传递给它的c'tor,无论出于何种原因(该类应该重新设计,但这是另一个问题)。 / p>

要在类定义中初始化变量时执行几个语句,可以将它包装在lambda中,并立即调用它:

class Foo {
    int i;
    int * p = []() {
        auto *ret = new int;
        *ret = 5;
        return ret;
    }(); // <-- Invokes the lambda right away
};

只允许在命名空间和类范围进行初始化。其他语句必须出现在lambda提供的块作用域中。

但它很乱,不明智,除非你真的需要,否则你不应该这样做。构造函数定义会更好。

答案 1 :(得分:2)

类定义由其成员声明组成(如果该类包含成员)。除了类定义中的声明外,您不能使用语句。

您的班级定义中的此陈述

*p = 5; // This doesn't worl

不是声明。而不是这两个陈述

int * p = new int;
*p = 5; // This doesn't worl

你可以只写声明

int * p = new int( 5 );

注意可以在类定义中使用的标准智能指针std::unique_ptr代替原始指针。在这种情况下,当对象停止存在时,将自动释放内存。例如

std::unique_ptr<int> p{ new int(5) };

答案 2 :(得分:0)

此语法无效。您不能简单地在类定义中编写代码。相反,你可以编写一个函数,你的代码将在其中运行:

class Foo {
public:
  void bar() {
    int * p = new int;
    *p = 5;
  }
};

int main(int argc, char ** argv) {
  Foo f;
  f.bar();
}

注意:您应该尽可能在单个语句中分配和初始化变量:

int *p = new int(5);

而不是:

int * p = new int;
*p = 5;