c++ - С调用带有字符串变量的静态类结构而没有c ++中的对象
问题描述
需要以代码中描述的格式接收数据,但问题在于字符串变量的操作。可以做些什么来避免错误?
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
const static int z1 = 1;
const static QString z2 = "word";
} z;
};
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
qDebug() << Class1::z.z2;
return a.exec();
}
错误:
class1.h:13: ошибка: in-class initialization of static data member 'const QString Class1::ZZ::z2' of non-literal type
const static QString z2 = "word";
^~
class1.h:13: ошибка: call to non-constexpr function 'QString::QString(const char*)'
const static QString z2 = "word";
^~~~~~
解决方案
免责声明:
我的第一印象是这段代码滥用class
和struct
实际namespace
发明的目的。
static
也就是说,答案集中在 OPs 代码中数据成员的技术问题上。
为了重现这个问题,我做了以下类似的例子:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2 = "word";
} z;
};
int main(int argc, char* argv[])
{
std::cout << Class1::z.z2;
}
输出:
main.cpp:11:34: error: in-class initialization of static data member 'const string Class1::ZZ::z2' of non-literal type
11 | static const std::string z2 = "word";
| ^~
main.cpp:11:39: error: temporary of non-literal type 'const string' {aka 'const std::__cxx11::basic_string<char>'} in a constant expression
11 | static const std::string z2 = "word";
| ^~~~~~
恕我直言,这已经足够接近 OP 的问题了。
TL;DR:问题是static
成员变量必须明确定义(非内联)或标记为inline
.
所以,我的修复看起来像这样:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
inline static struct ZZ {
static const int z1 = 1;
inline static const std::string z2 = "word";
} z = ZZ{};
};
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1
word
笔记:
虽然 和inline
是必需的struct ZZ
,std::string
但对于整数类型可以省略。因此,static const int z1 = 1;
将被接受而没有投诉(不带前缀inline
)。
进一步阅读:
cppreference.com 上的静态数据成员
为了进行比较,相同的代码可以在没有inline
:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2;
} z;
};
//Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1
word
笔记:
关于const Class1::ZZ Class1::z;
,我不太确定。缺少的定义可能会被忽略,因为Class1::z
它本身从未使用过。
为了检查这一点,我再次修改了示例:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2;
} z;
};
Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";
std::ostream& operator << (std::ostream &out, const Class1::ZZ &z)
{
return out << z.z1 << ", " << z.z2;
}
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1, word
1
word
笔记:
注释 的定义Class1::z
(如在前面的示例中)会导致链接错误。
推荐阅读
- html - 在不使用引导程序的情况下在导航标签中设置文本颜色的正确 CSS 语法是什么?
- azure - Azure B2C 自定义策略/自定义 ui - 从不同页面嵌入“密码重置”和“注册”按钮
- python - WSGI 服务器忽略 Flask config.from_object
- java - 如何使用多个索引查询 DynamoDB?
- sql - 如何为每个国家/地区选择最大的邮政编码
- flutter - 如何存储和检索列表
达到坚持 - docker - Nginx 重定向到后端-nginx 服务器返回错误的端口
- javascript - socket.io房间名称如何从前端传递到后端?
- django - ValidationError 未显示在模板中(尽管字段验证错误)
- reactjs - 如何将评级保存到本地存储,使其在刷新后不会消失?