是否可以在类初始化之前填充 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 '&lt;brace-enclosed initializer list&gt;' to 'const QHash&lt;Errs::Errs, QString&gt;*' in initialization 您使用的是什么 Qt 版本?在 Qt 5.5 中,QHash 有一个构造函数,它采用 initializer_list @MariusBancila 哦,对不起,它确实有效。不知道为什么,但是在我修改了我的代码以使用 std::map 之后,我再次将其更改为 QHash 并且它起作用了! 【参考方案1】:

在 C++11 及更高版本中,您可以执行以下操作(使用 C++ 标准库中的类而不是 QHashQString;您可能可以使其与 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

在类中初始化 const

初始化列表的使用(十五)

是否有理由我们能够在类定义中定义 [static const int] 而不能在其他静态 const 类型中定义? [复制]

const成员变量

statuc和const