使用static const string []作为成员而不是全局,在.cpp文件中初始化

时间:2018-04-02 11:08:42

标签: c++ arrays string static const

this相关。我想避免使用全局变量,因此我使用structenum以及std::string[](请参阅链接)来为小应用程序构建菜单。我还想将这些enum放在一个单独的头文件中。链接中选定的答案意味着使用--std=c++17,我想避免,至少现在,并决定使用static const std::string[] - 不需要包含额外的array }或vector因为它被初始化一次,从未被修改过,只有被调用,ALL总是被人知道。

正如其他相关答案所表明的那样,我需要在A::names之外初始化struct,或使用static const std::string&设置器(例如,请参阅this )。但到目前为止,所有答案都涉及std::string,而不是数组std::string[]

这是我尝试过的一个简单例子。它只是尝试使用A::names循环打印for()的内容,迭代enum中的struct A

A.H:

#ifndef A_H_INCLUDED
#define A_H_INCLUDED

#include <string>

struct A
{
    enum E { ONE, TWO, ALL };
    static const std::string names[ALL];
};
#endif // A_H_INCLUDED

a.cpp:

#include "a.h"

static const std::string A::names[A::ALL] { "one", "two" };

main.cpp中:

#include "a.h"
#include <iostream>

int main()
{
    for(int i=A::ONE; i<A::ALL; ++i)
        std::cout << A::names[i] << '\n';
    return 0;
}

g++ main.cpp之后的错误是:

main.cpp:(.text+0x24): undefined reference to `A::names[abi:cxx11]'
collect2: error: ld returned 1 exit status

看到cxx11,我认为g++ --std=c++11 main.cpp会解决它,但它没有。

那么,我做错了什么,或者,我如何使用setter修改版本以返回数组std::string[]?我的目标是替换一个全局变量,无论有多少次调用,它在内存中只有一个实例。

以下是一个改编的代码,来自一个小程序,关于我如何使用struct enumstringmenu_design = new QMenu...和{menuDesignAction()来构建菜单{1}}是更新的功能:

for(unsigned char i=0; i<A::ALL; ++i)    // needs initializing
{
    QAction *tmpAction {new QAction(tr(A::names[i].c_str()))};
    tmpAction->setObjectName(QString("%1").arg(i));
    connect(tmpAction, SIGNAL(triggered(bool)), this, SLOT(menuDesignAction()));
    menu_design->addAction(tmpAction);
}

作为旁注,在上面的代码段中,我必须使用.c_str(),但我在std::string中使用了enum。如果我可以*char[]代替std::string[],我会避免额外的通话吗?如果我没有错,我的问题(假设有)的答案怎么能被调整,以便能够以某种方式适应Qt片段?

0 个答案:

没有答案