【问题标题】:Is it possible to populate a const QHash (or similar) before class initialization?是否可以在类初始化之前填充 const QHash (或类似的)?
【发布时间】: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 并且它起作用了!

标签: c++ qt c++11


【解决方案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

【讨论】:

  • 哦,谢谢!我将研究非成员函数是否最适合我的情况,但我认为是这样。我稍后再报告给你! :)
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 2016-11-12
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2017-03-13
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多