访问类外的非静态数据成员
Access non static data member outside class
是否可以访问类外的非静态数据成员?假设您有一个像下面这样的示例。我知道它作为一个例子没有多大意义,但我只是想了解如何访问非静态数据成员。如果编译以下代码,它会生成一个错误:
C.h|70|error: invalid use of non-static data member ‘C::age’|
//刘昀class C{
public:
int age;
};
int getAge();
//C.cpp C::C()
{
age = 0;
}
int getAge(){
return (C::age);
}
非静态成员依赖于实例。当一个有效的实例初始化时,它们被初始化。
示例的问题在于,它试图通过类接口访问非静态成员,而不首先初始化具体实例。这是无效的。
你可以把它改成static
:
class C{
public:
static int age;
};
要求您在运行时使用int C::age = 0
之前还定义age
。注意,如果使用此方法,C::age
的值可以在运行时更改。
或者,您可以将其设置为const static
并直接初始化,如:
class C{
public:
const static int age = 0;
};
本例中C::age
的值为const
。
这两种方法都可以让您在没有实例的情况下获得它:C::age
.
如果不将其设置为静态,则必须创建一个值:
左值:
C c;
return c.age;
或右值:
return C().age;
// or
return C{}.age;
您的代码的问题是,您试图访问age
成员,而不创建类的实例。类的非静态数据成员只能通过类的实例访问,在您的示例中没有创建实例。
不能这样做的原因是,局部变量是在运行时分配到堆栈上的——如果你真的想使用一些内联asm,你可以获得它的位置,但它需要一些调试来获得堆栈位置,并且在函数之后,你想访问它,它更有可能被其他东西覆盖。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员