我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量.
我想要有类似的东西.
class A {
private:
static const string RECTANGLE = "rectangle";
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我从C++(g ++)编译器中得到了各种错误,例如:
ISO C++禁止成员'RECTANGLE'的初始化
非整数类型'std :: string'的静态数据成员的无效类初始化
错误:使'RECTANGLE'静止
这告诉我这种成员设计不符合标准.如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)
任何帮助表示赞赏.
让我先说明我的意图.在旧的(C++)时代,我们会有如下代码:
class C
{
public:
enum {SOME_VALUE=27};
};
Run Code Online (Sandbox Code Playgroud)
然后我们可以SOME_VALUE
在整个代码中使用编译时常量,无论编译器在哪里看C::SOME_VALUE
,它都只是插入文字27.
现在,将代码更改为以下内容似乎更为可接受:
class C
{
public:
static constexpr int SOME_VALUE=27;
};
Run Code Online (Sandbox Code Playgroud)
这看起来更清晰,提供SOME_VALUE
了一个定义良好的类型,并且似乎是C++ 11中的首选方法.(至少对我来说不可靠)问题是,这也导致SOME_VALUE
需要在外部进行的情况.也就是说,在某个地方的某个cpp文件中,我们需要添加:
constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage
Run Code Online (Sandbox Code Playgroud)
导致这种情况的情况似乎是在使用const引用时SOME_VALUE
,这在C++标准库代码中经常发生(请参阅本问题底部的示例).顺便说一句,我使用gcc 4.7.2作为我的编译器.
由于这种困境,我被迫恢复定义SOME_VALUE
为枚举(即旧学校),以避免必须为某些(但不是所有)静态constexpr成员变量的cpp文件添加定义.是不是有某种方法告诉编译器这constexpr int SOME_VALUE=27
意味着SOME_VALUE
应该只将其视为编译时常量而不是具有外部链接的对象?如果您看到与它一起使用的const引用,请创建一个临时引用.如果你看到它的地址,如果需要的话就会产生编译时错误,因为它是编译时常量而已.
以下是一些看似良性的示例代码,它们使我们需要SOME_VALUE
在cpp文件中添加定义(再次使用gcc 4.7.2进行测试):
#include <vector>
class C
{
public:
static constexpr int SOME_VALUE=5;
};
int main()
{
std::vector<int> iv;
iv.push_back(C::SOME_VALUE); // Will cause an undefined reference …
Run Code Online (Sandbox Code Playgroud) 是否可以在构造函数外部初始化静态const值?可以在找到成员声明的同一地点进行初始化吗?
class A {
private:
static const int a = 4;
/*...*/
};
Run Code Online (Sandbox Code Playgroud) 看起来我可以初始化一个POD静态const成员,但不是其他类型:
struct C {
static const int a = 42; // OK
static const string b = "hi"; // compile error
};
Run Code Online (Sandbox Code Playgroud)
为什么?
如果我这样做的话
class Gone
{
public:
static const int a = 3;
}
Run Code Online (Sandbox Code Playgroud)
它有效,但如果有的话
class Gone
{
public:
static int a = 3;
}
Run Code Online (Sandbox Code Playgroud)
它给出了编译错误.现在我知道为什么第二个不起作用,我只是不知道为什么第一个这样做.
提前致谢.
According to the standards you must define i
(这是一个静态const成员) outside of the class definition
...但是如果我为模板类的静态const成员变量执行此操作本身是通用的,那么我会得到链接错误(类似于在模板代码位于单独的编译单元中时获取链接错误).如果我在标题中定义它们,链接错误就会消失(我问是否可以generic
在这个问题的第一个位置定义它们).
我在做什么,安全吗?下面是标头中的静态const成员变量的定义之一.
template<typename T, unsigned int T_Size>
const Vector<T, T_Size> Vector<T, T_Size>::Zero = Vector<T, T_Size>(0);
Run Code Online (Sandbox Code Playgroud) 我有一个
class myclass
{
// ...
static const vector<pair<string,vector<string>>> var;
// ...
};
Run Code Online (Sandbox Code Playgroud)
在类定义中,使用单个字符串到其他几个字符串的映射.我使用vector <>而不是数组,以便能够添加映射对和映射长度,而不必使用大小变量.有没有办法在相应的.cpp文件中初始化变量,就像非复合类型的向量一样,即格式为:
const vector<pair<string,vector<string>>> myclass :: var =
{
???
}
Run Code Online (Sandbox Code Playgroud)
或者我必须使用静态方法,如
static myclass::initStaticMembers(){...}
Run Code Online (Sandbox Code Playgroud)
如果有第一种方法可以做到这一点,那么语法是什么?我搜索过,但没有找到复合std :: pair初始化的语法.例如,你可以初始化一个vector<string>
与
vector <string>myvec={"elem1", "elem2","elem3"};
Run Code Online (Sandbox Code Playgroud)
但你怎么开始复杂的vector<pair<string,vector<string>>>
?谢谢.