我有一个名为 的类Controller,在其中,我有一个名为 的类Button。AController包含多个Button不同类型的实例(例如button_type_a,button_type_b)。
控制器.h
#ifndef __controller__
#define __controller__
class Controller
{
public:
class Button
{
public:
Button(int type = -1);
private:
int type;
};
Controller();
Button A;
Button B;
Button X;
Button Y;
};
#endif
按钮类型是ints,我希望能够将某些按钮类型ints 与指向Button这些特定类型实例的指针相关联。
为了跟踪这种关联,我使用了 a std::map<int, Controller::Button*>,我使用了typedefa buttonmap_t。
Button当我(在Controller构造函数中)创建新实例时,构造Button函数将这些Buttons 的类型注册到映射中。
控制器.cpp
#include "controller.h"
#include <map>
typedef std::map<int, Controller::Button*> buttonmap_t;
buttonmap_t map;
Controller::Controller() :
A(0),
B(1),
X(2),
Y(3)
{ }
Controller::Button::Button(int type) :
type(type)
{
map[type] = this;
}
然后我创建一个全局Controller对象,并定义main().
主文件
#include <iostream>
#include "controller.h"
Controller controller;
int main(int argc, const char * argv[])
{
std::cout << "running..." << std::endl;
return 0;
}
根据我编译源代码的顺序,程序要么运行良好,要么触发分段错误:
apogee:MapTest$ gcc controller.cpp main.cpp -o maptest -lstdc++
apogee:MapTest$ ./maptest
running...
apogee:MapTest$ gcc main.cpp controller.cpp -o maptest -lstdc++
apogee:MapTest$ ./maptest
Segmentation fault: 11
后一种情况似乎是在正确初始化之前尝试使用地图,这导致了段错误。当我使用 Xcode 进行调试时,调试器在std::map调用时停止在“__tree”中__insert_node_at(),这会抛出EXC_BAD_ACCESS(code=1, address=0x0). 调用堆栈显示这是由第一个Button实例调用触发的map[type] = this;。
所以,这是我的多部分问题:
- 为什么编译顺序会导致这种情况发生?
- 有没有办法实现这种不受编译顺序影响的映射
int?Button* - 如果是这样,它是什么?
理想情况下,我仍然希望将所有Controller- 和 -Button相关代码放在单独的 controller.* 文件中。
这似乎与以下问题有些相关(但不完全相同):