我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做
class MyClass {
static int myDatum;
static {
/* do some computation which sets myDatum */
}
}
Run Code Online (Sandbox Code Playgroud)
除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?
我想要解决以下两个选项:
对于第二种选择,我在考虑:
class StaticInitialized {
static bool staticsInitialized = false;
virtual void initializeStatics();
StaticInitialized() {
if (!staticsInitialized) {
initializeStatics();
staticsInitialized = true;
}
}
};
class MyClass : private StaticInitialized {
static int myDatum;
void initializeStatics() {
/* computation which sets myDatum */
}
};
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为C++(目前?)不允许初始化非const静态成员.但是,至少可以通过表达式将静态块的问题减少到静态初始化的问题......
在面向对象语言(C++)中,您可以main()通过使用全局对象或类静态对象来执行代码,并让它们的构造函数运行您想要的代码.
有没有办法在C中这样做?我没有任何具体问题我想解决,我只是好奇.这可能有用的一件事是自动初始化库.
在gcc/g ++ 4.9下我可以写:
int x __attribute__((unused)) = f();
Run Code Online (Sandbox Code Playgroud)
表示x是故意未使用的.
是否有可能以[[]]某种方式使用C++ 11 属性表示法?
我试过了:
int x [[unused]] = f();
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
(是的,我知道它是一个实现定义的属性.)
我的问题类似于这些,但似乎并没有完全相关:
我得到的是这样的:
struct thingy;
struct container
{
static container& instance(); // singleton
int register_thingy(thingy*);
};
struct thingy
{
virtual ~thingy() {}
virtual int id() const = 0;
};
//template trick to force registration.
template < typename Derived >
struct registered_thingy : thingy
{
registered_thingy() : my_id(my_static_id) {}
int id() const { return my_id; }
private:
int my_id;
static int my_static_id;
}
template < typename Derived >
int registered_thingy<Derived>::my_static_id =
container::instance().register_thingy(new Derived);
Run Code Online (Sandbox Code Playgroud)
现在,concrete_thingy.cpp我在一个文件中:
struct my_concrete_thingy : registered_thingy<my_concrete_thingy> …Run Code Online (Sandbox Code Playgroud)