与this相关。我想避免使用全局变量,因此我使用struct
和enum
以及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
enum
和string
(menu_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片段?