现代(c++11
及以后)如何在类中声明静态变量,是否有可能做到这一点?
#include <iostream>
#include <string>
using namespace std;
int main()
{
class Class
{
static const short unsigned id = 1;
static const string name = "Заголовок 1";
public:
static short unsigned getId()
{
return id;
}
static string getName()
{
return name;
}
};
cout<<Class::getId()<<' '<<Class::getName()<<endl;
return 0;
}
我已经明白你只能从外部初始化静态类变量,或者只有当它们是常量时才可以,但这根本不起作用。
g++ -Wall -march=native -msse3 -O3 -fomit-frame-pointer -pipe -o "oop" "oop.cpp" (в каталоге: /home/ilya/Downloads/Qt)
oop.cpp: В функции «int main()»:
oop.cpp:10:36: ошибка: локальный класс «class main()::Class» не должен иметь статический элемент данных «const short unsigned int main()::Class::id» [-fpermissive]
static const short unsigned id = 1;
^
oop.cpp:11:30: ошибка: локальный класс «class main()::Class» не должен иметь статический элемент данных «const string main()::Class::name» [-fpermissive]
static const string name = "Заголовок 1";
^~~~~~~~~~~~~~~~~~~~~~
oop.cpp:11:23: ошибка: инициализация внутри класса статического элемента данных «const string main()::Class::name» нелитерального типа
static const string name = "Заголовок 1";
^~~~
oop.cpp:11:30: ошибка: вызов non-constexpr функции «std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [с _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]»
static const string name = "Заголовок 1";
^~~~~~~~~~~~~~~~~~~~~~
Сборка завершилась с ошибкой.
如果你从外面确定。
#include <iostream>
#include <string>
using namespace std;
int main()
{
class Class
{
public:
static short unsigned id;
static string name;
};
Class::id = 1;
Class::name = "Заголовок 1";
cout<<Class::id<<' '<<Class::name<<endl;
return 0;
}
那仍然行不通。
g++ -Wall -march=native -msse3 -O3 -fomit-frame-pointer -pipe -o "oop" "oop.cpp" (в каталоге: /home/ilya/Downloads/Qt)
oop.cpp: В функции «int main()»:
oop.cpp:11:25: ошибка: локальный класс «class main()::Class» не должен иметь статический элемент данных «short unsigned int main()::Class::id» [-fpermissive]
static short unsigned id;
^~
oop.cpp:12:17: ошибка: локальный класс «class main()::Class» не должен иметь статический элемент данных «std::__cxx11::string main()::Class::name» [-fpermissive]
static string name;
^~~~
Сборка завершилась с ошибкой.
为什么会发生这种情况,我做错了什么?
注意错误。它提到该类是本地的。
您可以删除 constness,初始化不会受此影响
在第二个例子中,你可以通过类名然后通过来访问
::
,我只是举了一个通过实例的例子,我.
也建议注意卷曲初始化,通过{}
,就像我做的那样id
,它有很多优点,但有时你应该更加小心,因为它原来是 objectstd::initializer_list
。至于类内部的初始化,如果我们有一个静态常量和一个整数类型是可能的:如果(且仅当)您使用初始化成员的方式是要将其作为对象存储在内存中,则必须在某处(一次)定义该成员。初始化器不能重复: