我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量.
我想要有类似的东西.
class A {
private:
static const string RECTANGLE = "rectangle";
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我从C++(g ++)编译器中得到了各种错误,例如:
ISO C++禁止成员'RECTANGLE'的初始化
非整数类型'std :: string'的静态数据成员的无效类初始化
错误:使'RECTANGLE'静止
这告诉我这种成员设计不符合标准.如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)
任何帮助表示赞赏.
这个问题是密切相关的先前问了一个问题在这里.
为了使Visual Studio 2010 C++调试器能够解析类内初始化的const变量,必须提供变量的全局定义.
例如
这是类定义:
class B{
public:
static const int m_b=100;
};
Run Code Online (Sandbox Code Playgroud)
以下是该成员的全局范围定义:
const int B::m_b;
Run Code Online (Sandbox Code Playgroud)
没有全局定义代码可以工作,但调试器在B的方法中看不到m_b.
然而,这导致另一个问题.在非平凡的头文件包含安排(下面给出的完整代码)中,Visual Studio产生此链接错误:
error LNK2005: "public: static int const B::m_b" (?m_b@B@@2HB) already defined in a.obj
1>a.exe : fatal error LNK1169: one or more multiply defined symbols found
Run Code Online (Sandbox Code Playgroud)
但是,GCC成功编译,链接和运行代码.
这是有问题的代码:
文件a.cpp:
#include <iostream>
#include "a.h"
const int B::m_b;
int main()
{
B b;
std::cout << b.m_b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
档案啊:
#pragma once
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
文件b.cpp:
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
文件bh: …