相关疑难解决方法(0)

在C++中初始化静态std :: map <int,int>

初始化静态地图的正确方法是什么?我们需要一个初始化它的静态函数吗?

c++ stl stdmap

425
推荐指数
10
解决办法
41万
查看次数

C++,我可以在编译时静态初始化std :: map吗?

如果我编码这个

std::map<int, char> example = {
                                (1, 'a'),
                                (2, 'b'),
                                (3, 'c') 
                              };
Run Code Online (Sandbox Code Playgroud)

然后g ++对我说

deducing from brace-enclosed initializer list requires #include <initializer_list>
in C++98 ‘example’ must be initialized by constructor, not by ‘{...}’   
Run Code Online (Sandbox Code Playgroud)

这让我很烦,因为构造函数是运行时的,理论上可能会失败.

当然,如果确实如此,它将很快失败并且应该一直这样做,所以我应该快速找到并纠正问题.

但是,我仍然很好奇 - 无论如何在编译时初始化地图,矢量等?


编辑:我应该说我正在为嵌入式系统开发.并非所有处理器都具有C++ 0x编译器.最受欢迎的可能是,但我不想遇到问题并且必须维护2个版本的代码.

至于Boost,我尚未决定.他们在嵌入式系统中使用他们的有限状态机类是多么的愚蠢,所以这就是我在这里编写的事件/事件/状态/ Fsm类.

叹了口气,我想我最好安全地玩,但我希望这个讨论对其他人有帮助.

c++ embedded stl

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

什么是与Java静态块等效的C++习惯用法?

我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做

class MyClass {
    static int myDatum;

    static {
        /* do some computation which sets myDatum */
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?

我想要解决以下两个选项:

  1. 进程加载时(或加载此类的DLL时)会发生初始化.
  2. 初始化在首次实例化类时发生.

对于第二种选择,我在考虑:

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++ java initialization static-block equivalent

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

标签 统计

c++ ×3

stl ×2

embedded ×1

equivalent ×1

initialization ×1

java ×1

static-block ×1

stdmap ×1