在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:
class foo
{
private:
static int i;
};
int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)
我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?
我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量.
我想要有类似的东西.
class A {
private:
static const string RECTANGLE = "rectangle";
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我从C++(g ++)编译器中得到了各种错误,例如:
ISO C++禁止成员'RECTANGLE'的初始化
非整数类型'std :: string'的静态数据成员的无效类初始化
错误:使'RECTANGLE'静止
这告诉我这种成员设计不符合标准.如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)
任何帮助表示赞赏.
非常简单地说:
我有一个主要由静态公共成员组成的类,所以我可以将类似的函数组合在一起,但仍然需要从其他类/函数中调用它们.
无论如何,我在我的类公共范围中定义了两个静态unsigned char变量,当我尝试在同一个类的构造函数中修改这些值时,我在编译时遇到"未解析的外部符号"错误.
class test
{
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
test::test()
{
X = 1;
Y = 2;
}
Run Code Online (Sandbox Code Playgroud)
我是C++的新手,所以对我很轻松.为什么我不能这样做?
我想在头文件中为我的.cpp文件定义一个常量char*.所以我试过这个:
private:
static const char *SOMETHING = "sommething";
Run Code Online (Sandbox Code Playgroud)
这给我带来了以下编译器错误:
错误C2864:'SomeClass :: SOMETHING':只能在类中初始化静态const积分数据成员
我是C++的新手.这里发生了什么?为什么这是非法的?你怎么能这样做呢?
给定是一个具有静态成员的类.
class BaseClass
{
public:
static std::string bstring;
};
Run Code Online (Sandbox Code Playgroud)
字符串显然是在类之外进行默认初始化.
std::string BaseClass::bstring {"."};
Run Code Online (Sandbox Code Playgroud)
如果我在标题中包含上面的行以及类,我会收到symbol multiply defined错误.它必须在单独的cpp文件中定义,即使使用include guards或pragma once.
有没有办法在标题中定义它?
我试图定义一个这样的公共静态变量:
public :
static int j=0; //or any other value too
Run Code Online (Sandbox Code Playgroud)
我在这一行得到了一个编译错误:ISO C++禁止非const静态成员`j'的类内初始化.
为什么在C++中不允许这样做?
为什么允许const成员初始化?
这是否意味着C++中的静态变量没有像C一样用0初始化?
谢谢 !
我有一个在头文件中声明和实现的C++类.我选择这个是因为由于_GLIBCXX_DEBUG和预编译的库,不能轻易地在Debug和Release版本之间移动.例如,如果我定义_GLIBCXX_DEBUG,Boost将因源文件中的ABI更改而崩溃.
仅标头实现已创建重复符号的问题.例如,在下面的类中operator==,非成员swap将生成多个定义的符号.
// Foo.hpp
namespace Bar
{
template
class Foo
{
...
};
bool operator==(const Foo& a, const Foo& b) {
..
}
}
namespace std
{
template <>
void swap(Bar::Foo& a, Bar::Foo& b)
{
a.swap(b);
}
}
Run Code Online (Sandbox Code Playgroud)
当声明和实现被拆分时,文件(Foo.hpp和Foo.cpp)编译并链接好了.
有什么办法可以正确编译和链接?
我有一些小的头文件库(仅头部部分很重要).在初始版本中,我在其中定义的类中有一些静态成员.直到后来(当我在一个更大的项目中使用它们时)我才发现静态成员会违反ODR.我想让它们只保留头文件,因此在一个单独的.cpp文件中定义静态成员是不可能的.一个众所周知的解决方案是为每个静态成员使用Meyers单例函数 - 局部静态变量(例如,如此处所示).
这一切都很好,但由于我希望单例表现得像一个成员变量,我希望能够使用setter和getter来获取和设置值.但是Meyers单例功能的局部静态变量看起来像是什么?我无法找到任何特定问题的解决方案.
澄清一下,这些是要求:
编辑1:
我想解释一下为什么你可能需要这个.
我提到的库中的静态变量定义了一些参数的默认值.但是,我想让用户选择在程序开头设置默认值,而不是硬编码这些默认值,这样他们就不必在每次调用成员函数或构造一个函数时手动传递值.新实例.
此外,虽然我同意在这里提供的示例中使用术语"Meyers singleton"具有误导性(我只是使用了一个int值),但是没有什么能阻止您使用这个范例而只需要一个自定义类的例子.在这种情况下,"Meyers singleton"一词是合理的.
编辑2:
这与inline staticC++ 17中的变量引入有些无关,但我会把它留给那些没有选择使用C++ 17的人.