非静态成员函数是否可以访问静态成员函数或数据
Can non-static member function access static member function or data?
我在网上搜索,发现有人说非静态成员函数可以访问静态成员函数或数据。然后我写了一个程序来验证它
#include <iostream>
class test
{
public:
static int a;
void printa()
{
std::cout<<a;
}
};
int main(int argc, const char * argv[])
{
test m;
m.printa();
return 0;
}
代码生成链接器错误!
Undefined symbols for architecture x86_64:
"test::a", referenced from:
test::printa() in main.o
在类内将变量声明为static
只是一种声明。
您还需要定义变量,这意味着在单个编译单元中添加此行:
int test::a = 0;
更准确地说:编译单元基本上是一个.cpp文件。您应该而不是将该行直接放在头文件中,否则您将得到相反的错误:"多重定义…"。
正如您所猜测的,一旦程序启动,这也会将变量初始化为0
。
如果您将这一行放在类声明下,它将解决您的问题(在这种特定情况下:记住不要将其写在头文件中(。
这是因为您只声明了test::a
,而没有定义它:
#include <iostream>
class test
{
...
};
int test::a = 1; //Needs a definition!
您只声明了static
数据成员。你还没有定义它。
你需要做一些类似int test:: a;
的事情来定义它。
也看到这个
允许非静态成员访问静态数据成员。不允许反向,因为静态成员不属于任何对象
您必须定义静态数据成员实例。添加一行。。。
int test::a;
高于main()
或低于main()
。。。基本上是与class test
直接在同一命名空间范围内并且在class test
的定义之后的任何地方。
相关文章:
- 如何在C++中使用非静态成员函数作为回调函数
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 为什么传递非静态成员函数会导致编译错误?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 在类定义中推导内联静态成员函数的返回类型
- `enable_if()`以禁用模板化类的静态成员函数声明
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 常量静态成员函数
- 使用 vector.sort() 的非静态成员函数无效使用
- 从静态成员函数访问私有非静态类变量 - C++