是否可以在类初始化之前填充const QHash(或类似的)?

时间:2015-10-22 21:30:19

标签: c++ qt c++11

我尝试做类似错误管理器类的事情,将枚举值链接到字符串以及其他不重要的事情。

当我编码的时候,我停下来让我好奇的东西是否可能。我的方式,我的类有一个QHash对象,将在构造函数中填充:

class PrtsERrs {
private: 
    QHash<int, QString> err;
public:
    PrtsErrs() {
        err.insert(MyEnum::ZERO_VALUE, "zero");
        err.insert(MyEnum::ONE_VALUE, "one");
        ...
    }
}

但我认为它错了#34;然后我试图找到更好的东西或者#34;正确的方式&#34;但我失败了。

我尝试做的事情是这样的:

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做类似的事吗?如果是这样,这是最好的方式吗?

1 个答案:

答案 0 :(得分:4)

在C ++ 11及更高版本中,您可以执行以下操作(使用C ++标准库中的类而不是QHashQString;您可以使用{{1} } / QHash稍加修改一下):

QString

您可以试用上面的代码here。但是,我不是要将类转换为字符串,而是recommend making a non-member function。如:

#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