我想要一个具有私有静态数据成员的类(包含所有字符az的向量).在java或C#中,我可以创建一个"静态构造函数",它将在我创建类的任何实例之前运行,并设置类的静态数据成员.它只运行一次(因为变量是只读的,只需要设置一次),因为它是类的一个函数,它可以访问它的私有成员.我可以在构造函数中添加代码来检查向量是否已初始化,如果不是,则初始化它,但是这会引入许多必要的检查,并且似乎不是问题的最佳解决方案.
我想到,因为变量只是只读的,所以它们只能是公共的静态const,所以我可以在类外面设置它们,但是再一次,它看起来有点像丑陋的黑客.
如果我不想在实例构造函数中初始化它们,是否可以在类中拥有私有静态数据成员?
我想这样做:
template <typename T>
struct S
{
...
static double something_relevant = 1.5;
};
Run Code Online (Sandbox Code Playgroud)
但我不能因为something_relevant不是整体类型.它不依赖于T,但现有代码依赖于它是静态成员S.
由于S是模板,我不能将定义放在编译文件中.我该如何解决这个问题?
我上课了
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Run Code Online (Sandbox Code Playgroud)
在s源文件中初始化字符串的最佳位置在哪里?
使用C++ 17,我们得到内联变量.
其中一个用途是在类中定义常量字段.
那么这两个常量定义之间的区别是什么:
class MyClass {
static constexpr int myFirstVar = 10;
static const inline int mySecondVar = 100;
};
Run Code Online (Sandbox Code Playgroud)
当然constexpr是myFirstVar隐式内联.
什么是更好的选择,使用constexpr或inline?
注意:当你不需要constness时,那就inline更容易了.随着constexpr你没有这样的选择.
在非模板库类中拥有静态成员的最佳方法是什么,而不必在类用户上承担定义成员的负担?
说我想提供这个课程:
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)
我在下面有一个答案,但它有一些缺点.是否有更好和/或更优雅的解决方案?
给定是一个具有静态成员的类.
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.
有没有办法在标题中定义它?
具有以下代码的问题是"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++的经验预先添加了字符串类,所以我在某些方面重新开始.
我正在为我的类定义我的头文件,并希望为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)
但这在链接期间给了我一个重复的定义.
我怎么能做到这一点?
我有一个类,我想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; }
这些方法分别因以下原因而失败:
const string MyClass::foo非文字类型的静态数据成员的类内初始化foo- 它似乎不喜欢extern与const或组合static我想在头文件而不是源文件中使用声明的原因.这是一个将被扩展的类,它的所有其他函数都是纯虚拟的,所以我目前除了这些变量之外没有其他原因要有源文件.
那么怎么做呢?
是否可以在类的定义中的头(.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++ ×10
static ×4
class ×2
c++17 ×1
const ×1
constants ×1
definition ×1
header ×1
header-only ×1
initializer ×1
private ×1
templates ×1