在 c++ 中使用字符串变量选择静态类结构,而不带对象
Сalling a static class structure with string variables without an object in 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";
^~~~~~
来源 github.com
免责声明:
我的第一印象是,这段代码滥用了class
,struct
namespace
实际上是为了什么而发明的。
也就是说,答案集中在 OPs 代码中static
数据成员的技术问题上。
为了重现该问题,我制作了以下类似示例:
#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
的定义(如上一个示例中所示)会导致链接错误。
相关文章:
- 为什么我们再次从结构对象创建结构变量?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 结构对象的指针成员在传递给函数时被修改
- C++ 提升 - 包含类层次结构对象的类的序列化
- 如何将变量从变量传递到指针结构对象
- 在 boost::heap::p riority_queue 中推送结构对象时出错
- 在 c++ 中将结构的每个成员写入文件和将结构对象直接写入文件之间有什么区别吗?
- 为什么结构对象不是类型?
- 程序不会编译,使用带有结构对象的数组
- 在类构造函数中初始化自定义结构对象的正确方法
- 使用QString或字符串调用结构对象
- 在输入结构对象的输入过程中运行时间错误
- C 中的堆是否包含类和结构对象,或者仅包含指针
- 如何将部分初始化的结构对象放入向量
- 如何分配给结构对象的成员
- 尝试创建结构对象,在位置0x3FE00000中创建访问冲突写入错误
- erase() 不适用于结构/对象内的 STL 向量
- 将指向参数个数可变的函数的指针存储在结构对象中
- 如何通过先前存储的ID从结构对象中检索值?C
- 非结构对象布局