无法为 class 中的变量赋值
Can't assign a value to a variable inside a class
#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.
};
为什么?我看到这只发生在 class 中,如果我在主函数上编写相同的代码它应该可以工作。
此语法无效。您不能简单地在 class 定义中编写代码。相反,您可以编写一个函数,您的代码将在其中运行:
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;
我写这篇文章的假设是您需要动态分配一个成员,并且您不能出于任何原因简单地将参数传递给它的 c'tor(class 应该重新设计,但是这是另一个问题)。
要在 class 定义中执行一些语句作为初始化变量的一部分,您可以将其包装在 lambda 中,并立即调用它:
class Foo {
int i;
int * p = []() {
auto *ret = new int;
*ret = 5;
return ret;
}(); // <-- Invokes the lambda right away
};
只允许在命名空间和 class 范围内进行初始化。其他语句必须出现在 lambda 提供的块范围内。
但它很混乱,不明智,除非你真的必须这样做,否则你不应该这样做。构造函数定义会更好。
A class 定义由其成员声明组成(如果 class 包含成员)。您不能在 class 定义中使用声明以外的语句。
此语句在您的 class 定义中
*p = 5; // This doesn't worl
不是声明。而不是这两个语句
int * p = new int;
*p = 5; // This doesn't worl
你可以只写声明
int * p = new int( 5 );
注意标准智能指针 std::unique_ptr
可以用来代替 class 定义中的原始指针。在这种情况下,当对象不再存在时,内存将自动释放。例如
std::unique_ptr<int> p{ new int(5) };
#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.
};
为什么?我看到这只发生在 class 中,如果我在主函数上编写相同的代码它应该可以工作。
此语法无效。您不能简单地在 class 定义中编写代码。相反,您可以编写一个函数,您的代码将在其中运行:
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;
我写这篇文章的假设是您需要动态分配一个成员,并且您不能出于任何原因简单地将参数传递给它的 c'tor(class 应该重新设计,但是这是另一个问题)。
要在 class 定义中执行一些语句作为初始化变量的一部分,您可以将其包装在 lambda 中,并立即调用它:
class Foo {
int i;
int * p = []() {
auto *ret = new int;
*ret = 5;
return ret;
}(); // <-- Invokes the lambda right away
};
只允许在命名空间和 class 范围内进行初始化。其他语句必须出现在 lambda 提供的块范围内。
但它很混乱,不明智,除非你真的必须这样做,否则你不应该这样做。构造函数定义会更好。
A class 定义由其成员声明组成(如果 class 包含成员)。您不能在 class 定义中使用声明以外的语句。
此语句在您的 class 定义中
*p = 5; // This doesn't worl
不是声明。而不是这两个语句
int * p = new int;
*p = 5; // This doesn't worl
你可以只写声明
int * p = new int( 5 );
注意标准智能指针 std::unique_ptr
可以用来代替 class 定义中的原始指针。在这种情况下,当对象不再存在时,内存将自动释放。例如
std::unique_ptr<int> p{ new int(5) };