相关疑难解决方法(0)

如何在C++中初始化私有静态成员?

在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:

class foo
{
    private:
        static int i;
};

int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?

c++ initialization static-members

492
推荐指数
11
解决办法
47万
查看次数

静态常量字符串(类成员)

我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量.

我想要有类似的东西.

class A {
   private:
      static const string RECTANGLE = "rectangle";
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我从C++(g ++)编译器中得到了各种错误,例如:

ISO C++禁止成员'RECTANGLE'的初始化

非整数类型'std :: string'的静态数据成员的无效类初始化

错误:使'RECTANGLE'静止

这告诉我这种成员设计不符合标准.如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)

任何帮助表示赞赏.

c++ string static const class

429
推荐指数
8
解决办法
35万
查看次数

静态类成员上未解析的外部符号

非常简单地说:

我有一个主要由静态公共成员组成的类,所以我可以将类似的函数组合在一起,但仍然需要从其他类/函数中调用它们.

无论如何,我在我的类公共范围中定义了两个静态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++的新手,所以对我很轻松.为什么我不能这样做?

c++ static class members

122
推荐指数
5
解决办法
12万
查看次数

如何在头文件中声明静态const char*?

我想在头文件中为我的.cpp文件定义一个常量char*.所以我试过这个:

private:
    static const char *SOMETHING = "sommething";
Run Code Online (Sandbox Code Playgroud)

这给我带来了以下编译器错误:

错误C2864:'SomeClass :: SOMETHING':只能在类中初始化静态const积分数据成员

我是C++的新手.这里发生了什么?为什么这是非法的?你怎么能这样做呢?

c++ constants

57
推荐指数
5
解决办法
10万
查看次数

如何初始化标头中的静态成员

给定是一个具有静态成员的类.

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 guardspragma once.

有没有办法在标题中定义它?

c++ class static-members

35
推荐指数
4
解决办法
4万
查看次数

在C++中定义静态成员

我试图定义一个这样的公共静态变量:

public :
         static int j=0;        //or any other value too
Run Code Online (Sandbox Code Playgroud)

我在这一行得到了一个编译错误:ISO C++禁止非const静态成员`j'的类内初始化.

  1. 为什么在C++中不允许这样做?

  2. 为什么允许const成员初始化?

  3. 这是否意味着C++中的静态变量没有像C一样用0初始化?

谢谢 !

c++ static

25
推荐指数
4
解决办法
3万
查看次数

带有标头实现的重复符号

我有一个在头文件中声明和实现的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)编译并链接好了.

有什么办法可以正确编译和链接?

c++ compiler-construction symbols build

6
推荐指数
1
解决办法
1852
查看次数

标头库中的静态成员

我正在创建仅限标头的库,我必须使用静态成员.
是否可以在头文件中定义它而不重新定义警告?

c++

6
推荐指数
1
解决办法
1317
查看次数

适用于仅限标头库中的静态成员变量的setter和getter

我有一些小的头文件库(仅头部部分很重要).在初始版本中,我在其中定义的类中有一些静态成员.直到后来(当我在一个更大的项目中使用它们时)我才发现静态成员会违反ODR.我想让它们只保留头文件,因此在一个单独的.cpp文件中定义静态成员是不可能的.一个众所周知的解决方案是为每个静态成员使用Meyers单例函数 - 局部静态变量(例如,如此处所示).

这一切都很好,但由于我希望单例表现得像一个成员变量,我希望能够使用setter和getter来获取和设置值.但是Meyers单例功能的局部静态变量看起来像是什么?我无法找到任何特定问题的解决方案.

澄清一下,这些是要求:

  • 我希望静态成员变量的行为在一个只有头的库中(所以我不能把定义放在.cpp文件中)
  • 我想要一个只有 getter的getter(我不能通过赋值给getter返回的引用来修改它)
  • 我还希望能够通过专用的setter修改该值.

编辑1:

我想解释一下为什么你可能需要这个.

我提到的库中的静态变量定义了一些参数的默认值.但是,我想让用户选择在程序开头设置默认值,而不是硬编码这些默认值,这样他们就不必在每次调用成员函数或构造一个函数时手动传递值.新实例.

此外,虽然我同意在这里提供的示例中使用术语"Meyers singleton"具有误导性(我只是使用了一个int值),但是没有什么能阻止您使用这个范例而只需要一个自定义类的例子.在这种情况下,"Meyers singleton"一词是合理的.


编辑2:

这与inline staticC++ 17中的变量引入有些无关,但我会把它留给那些没有选择使用C++ 17的人.

c++ singleton static-members getter-setter header-only

4
推荐指数
1
解决办法
1738
查看次数