是否可以在类初始化之前填充 const QHash (或类似的)?
Posted
技术标签:
【中文标题】是否可以在类初始化之前填充 const QHash (或类似的)?【英文标题】:Is it possible to populate a const QHash (or similar) before class initialization? 【发布时间】:2015-10-22 21:30:19 【问题描述】:我正在尝试做一些类似错误管理器类的事情,将枚举值链接到字符串和其他不重要的事情。
当我编写代码时,我停下来做一些让我好奇的事情,这是否可能。我的做法是,我的类有一个 QHash 对象,它将在构造函数中填充:
class PrtsERrs
private:
QHash<int, QString> err;
public:
PrtsErrs()
err.insert(MyEnum::ZERO_VALUE, "zero");
err.insert(MyEnum::ONE_VALUE, "one");
...
但我认为这是“错误的”,然后我试图找到更好或“正确的方法”但我失败了。
我想做的是这样的:
namespace Errs
enum Errs
ERR_TEST1 = 0,
ERR_TEST2,
ERR_TEST3
;
class PrtsErrs
private:
const QHash<Errs::Errs, QString> errStr;
public:
PrtsErrs() : errStr (Errs::ERR_TEST1, "Test",
Errs::ERR_TEST2, "Test2",
Errs::ERR_TEST3, "Test3"
)
QString errStr(Errs::Errs errCode) const return errStr[errCode];
;
是否可以使用 c++11 和 Qt 做类似的事情?如果是这样,这是最好的方法吗?
【问题讨论】:
试试errStr Errs::ERR_TEST1, "Test", Errs::ERR_TEST2, "Test2", Errs::ERR_TEST3, "Test3"
@MariusBancila 不成功:/,但谢谢! error: cannot convert '<brace-enclosed initializer list>' to 'const QHash<Errs::Errs, QString>*' in initialization
您使用的是什么 Qt 版本?在 Qt 5.5 中,QHash
有一个构造函数,它采用 initializer_list
。
@MariusBancila 哦,对不起,它确实有效。不知道为什么,但是在我修改了我的代码以使用 std::map
之后,我再次将其更改为 QHash
并且它起作用了!
【参考方案1】:
在 C++11 及更高版本中,您可以执行以下操作(使用 C++ 标准库中的类而不是 QHash
和 QString
;您可能可以使其与 QHash
/QString
一起使用一些小的修改):
#include <iostream>
#include <map>
namespace Errs
enum Errs
ERR_TEST1 = 0,
ERR_TEST2,
ERR_TEST3
;
class PrtsErrs
private:
const std::map<Errs::Errs, std::string> errStr
Errs::Errs::ERR_TEST1, "ERR_TEST1" ,
Errs::Errs::ERR_TEST2, "ERR_TEST2" ,
Errs::Errs::ERR_TEST3, "ERR_TEST3"
;
public:
std::string GetErrStr(Errs::Errs errCode) const
return errStr.at(errCode);
;
int main()
PrtsErrs foo ;
std::cout << foo.GetErrStr(Errs::Errs::ERR_TEST2) << std::endl ;
return 0;
你可以试试上面的代码here。但是,我不会创建一个将枚举转换为字符串的类,而是recommend making a non-member function。如:
std::string errs_to_string(Errs::Errs errCode)
static const std::map<Errs::Errs, std::string> errStr
Errs::Errs::ERR_TEST1, "ERR_TEST1" ,
Errs::Errs::ERR_TEST2, "ERR_TEST2" ,
Errs::Errs::ERR_TEST3, "ERR_TEST3"
;
return errStr.at(errCode) ;
试试上面的函数here。
【讨论】:
哦,谢谢!我将研究非成员函数是否最适合我的情况,但我认为是这样。我稍后再报告给你! :)以上是关于是否可以在类初始化之前填充 const QHash (或类似的)?的主要内容,如果未能解决你的问题,请参考以下文章
通过加入现有的 QHash 来初始化 const QHash
是否有理由我们能够在类定义中定义 [static const int] 而不能在其他静态 const 类型中定义? [复制]