目录
原因:静态函数访问了非静态变量, static函数与非static变量混用,示例代码如下
- class FLOWEDITORSHARED_EXPORT NETranslator
- {
- public:
- NETranslator();
- static QString ch2En(const QString &ch);
- static QString en2Ch(const QString &en);
-
- private:
- QHash
m_hash; - };
- //
- NETranslator::NETranslator()
- {
- m_hash.insert("image", QStringLiteral("图像数据"));
- m_hash.insert("region", QStringLiteral("区域数据"));
- m_hash.insert("contours", QStringLiteral("轮廓数据"));
- }
-
- QString NETranslator::ch2En(const QString &ch)
- {
- QString en = m_hash.key(ch, ch);
- return en;
- }
-
- QString NETranslator::en2Ch(const QString &en)
- {
- QString ch = m_hash.value(en, en);
- return ch;
- }
上述代码编译将会出现以下错误:
NETranslator.cpp:12: error: C2228: “.key”的左边必须有类/结构/联合
NETranslator.cpp:18: error: C2228: “.value”的左边必须有类/结构/联合
那么把类变量也声明为static是否有用了,修改代码如下:
- class FLOWEDITORSHARED_EXPORT NETranslator
- {
- public:
- NETranslator();
- static QString ch2En(const QString &ch);
- static QString en2Ch(const QString &en);
-
- private:
- static QHash
m_hash; //修改了此处,静态声明 - };
再次编译出现了以下错误
NETranslator.obj👎 error: LNK2019: 无法解析的外部符号 "public: static class QHash
NETranslator::m_hash" (?m_hash@NETranslator@@2V?$QHash@VQString@@V1@@@A),该符号在函数 "public: __cdecl NETranslator::NETranslator(void)" (??0NETranslator@@QEAA@XZ) 中被引用
无法解析的外部符号大部分原因是只做了声明,没有定义。类的静态成员必须在类内声明,在类外初始化。修改代码如下:
- class FLOWEDITORSHARED_EXPORT NETranslator
- {
- public:
- NETranslator();
- static QString ch2En(const QString &ch);
- static QString en2Ch(const QString &en);
-
- private:
- static QHash
m_hash; //修改了此处,静态声明 - };
- //
- QHash
NETranslator::m_hash; //修改了此处,定义 -
- NETranslator::NETranslator()
- {
- m_hash.insert("image", QStringLiteral("图像数据"));
- m_hash.insert("region", QStringLiteral("区域数据"));
- m_hash.insert("contours", QStringLiteral("轮廓数据"));
- }
-
- QString NETranslator::ch2En(const QString &ch)
- {
- QString en = m_hash.key(ch, ch);
- return en;
- }
-
- QString NETranslator::en2Ch(const QString &en)
- {
- QString ch = m_hash.value(en, en);
- return ch;
- }
声明也有了,定义也有了,编译通过。上述方案m_hash虽然插入了值,但是函数中访问的m_hash数据为空。
原因:使用NETranslator::ch2En() 方式去调用,并没有调用NETranslator构造函数,所以就没有初始化数据
那怎么办了,就只能在静态变量初始化时赋值了,修改代码如下:
- QHash
LinkTranslator::m_hash = - {
- {"image", QStringLiteral("图像数据")},
- {"region", QStringLiteral("区域数据")},
- {"contours", QStringLiteral("轮廓数据")},
- };
如果在构造函数中初始化数据,只要调用构造函数就可以了
- class FLOWEDITORSHARED_EXPORT NETranslator
- {
- public:
- NETranslator();
- static QString ch2En(const QString &ch);
- static QString en2Ch(const QString &en);
-
- private:
- QHash
m_hash; - };
-
-
- NETranslator::NETranslator()
- {
- m_hash.insert("image", QStringLiteral("图像数据"));
- m_hash.insert("region", QStringLiteral("区域数据"));
- m_hash.insert("contours", QStringLiteral("轮廓数据"));
- }
- QString NETranslator::ch2En(const QString &ch)
- {
- NETranslator tran; //修改了此处
- QString en = tran.m_hash.key(ch, ch);
- return en;
- }
-
- QString NETranslator::en2Ch(const QString &en)
- {
- NETranslator tran; //修改了此处
- QString ch = tran.m_hash.value(en, en);
- return ch;
- }