相关疑难解决方法(0)

C++中的静态构造函数?我需要初始化私有静态对象

我想要一个具有私有静态数据成员的类(包含所有字符az的向量).在java或C#中,我可以创建一个"静态构造函数",它将在我创建类的任何实例之前运行,并设置类的静态数据成员.它只运行一次(因为变量是只读的,只需要设置一次),因为它是类的一个函数,它可以访问它的私有成员.我可以在构造函数中添加代码来检查向量是否已初始化,如果不是,则初始化它,但是这会引入许多必要的检查,并且似乎不是问题的最佳解决方案.

我想到,因为变量只是只读的,所以它们只能是公共的静态const,所以我可以在类外面设置它们,但是再一次,它看起来有点像丑陋的黑客.

如果我不想在实例构造函数中初始化它们,是否可以在类中拥有私有静态数据成员?

c++ static private static-constructor initializer

172
推荐指数
8
解决办法
15万
查看次数

类模板中的静态成员初始化

我想这样做:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};
Run Code Online (Sandbox Code Playgroud)

但我不能因为something_relevant不是整体类型.它不依赖于T,但现有代码依赖于它是静态成员S.

由于S是模板,我不能将定义放在编译文件中.我该如何解决这个问题?

c++ static templates

138
推荐指数
3
解决办法
8万
查看次数

C++在哪里初始化静态const

我上课了

class foo {
public:
   foo();
   foo( int );
private:
   static const string s;
};
Run Code Online (Sandbox Code Playgroud)

s源文件中初始化字符串的最佳位置在哪里?

c++ static initialization constants

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

静态constexpr和C++ 17中的静态内联变量有什么区别?

使用C++ 17,我们得到内联变量.

其中一个用途是在类中定义常量字段.

那么这两个常量定义之间的区别是什么:

class MyClass {
    static constexpr int myFirstVar = 10;
    static const inline int mySecondVar = 100;
};
Run Code Online (Sandbox Code Playgroud)

当然constexprmyFirstVar隐式内联.

什么是更好的选择,使用constexprinline

注意:当你不需要constness时,那就inline更容易了.随着constexpr你没有这样的选择.

c++ c++17

50
推荐指数
1
解决办法
8320
查看次数

如何在仅头文件库中拥有静态数据成员?

在非模板库类中拥有静态成员的最佳方法是什么,而不必在类用户上承担定义成员的负担?

说我想提供这个课程:

class i_want_a_static_member
{
    static expensive_resource static_resource_;

public:
    void foo()
    {
        static_resource_.bar();
    }
};
Run Code Online (Sandbox Code Playgroud)

那么类的用户一定不要忘了某处定义静态成员(如已经回答了 很多 ):

// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;
Run Code Online (Sandbox Code Playgroud)

我在下面有一个答案,但它有一些缺点.是否有更好和/或更优雅的解决方案?

c++ static-members header-only

45
推荐指数
3
解决办法
1万
查看次数

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

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

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万
查看次数

static const double不能有类内初始值设定项.为什么会这样?

具有以下代码的问题是"const double"类型的静态成员,不能具有类内初始化程序.为什么仅适用于以下代码中的'const double'?请帮我.

class sample{
   static const char mc = '?';
   static const double md = 2.2;
   static const bool mb = true;
};
const char sample::mc;
const double sample::md;
const bool sample::mb;
int main(){
}
Run Code Online (Sandbox Code Playgroud)

c++

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

如何在C++中定义字符串常量?

可能重复:
C++静态常量字符串(类成员)
static const C++类成员初始化在链接时给出重复的符号错误

我使用C++的经验预先添加了字符串类,所以我在某些方面重新开始.

我正在为我的类定义我的头文件,并希望为url创建一个静态常量.我这样做的方法如下:

#include <string>
class MainController{
private:
    static const std::string SOME_URL;
}

const std::string MainController::SOME_URL = "www.google.com";
Run Code Online (Sandbox Code Playgroud)

但这在链接期间给了我一个重复的定义.

我怎么能做到这一点?

c++ class definition

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

如何在头文件中定义const static std :: string?

我有一个类,我想std::string通过getter 存储一个真正的const或有效const 的静态.

我尝试了几种直接方法
1.

const static std::string foo = "bar";

2.

const extern std::string foo; //defined at the bottom of the header like so 
...//remaining code in header
};  //close header class declaration
std::string MyClass::foo = "bar"
/#endif // MYCLASS_H

我也试过了

3.

protected:
    static std::string foo;
public:
    static std::string getFoo() { return foo; }

这些方法分别因以下原因而失败:

  1. 错误:const string MyClass::foo非文字类型的静态数据成员的类内初始化
  2. 指定的存储类foo- 它似乎不喜欢externconst或组合static
  3. 许多'未定义的引用'由我的代码的其他部分生成的错误,甚至是getter函数的返回行

我想在头文件而不是源文件中使用声明的原因.这是一个将被扩展的类,它的所有其他函数都是纯虚拟的,所以我目前除了这些变量之外没有其他原因要有源文件.

那么怎么做呢?

c++ static const header

14
推荐指数
2
解决办法
3万
查看次数

我可以在类的定义中的头文件中声明一个字符串吗?

是否可以在类的定义中的头(.h)文件中声明一个字符串?

当我想设置默认值时int,我会:

 class MyClass
 {
     static const unsigned int kDATA_IMAGE_WIDTH =  1024;
Run Code Online (Sandbox Code Playgroud)

有没有办法对string对象做同样的事情?

 class MyClass
 {
      static const string kDEFAULT_FILE_EXTENSION = "png"; // fail
Run Code Online (Sandbox Code Playgroud)

我知道我可以用#define......

 #define kDEFAULT_FILE_EXTENSION "png"
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:添加它在类定义中.更新的例子.

c++

9
推荐指数
1
解决办法
2万
查看次数