#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.
};
为什么?我看到这只发生在一个类中,如果我在主函数上编写相同的代码它应该工作。
答案 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;