我有一个名为 的类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
按钮类型是int
s,我希望能够将某些按钮类型int
s 与指向Button
这些特定类型实例的指针相关联。
为了跟踪这种关联,我使用了 a std::map<int, Controller::Button*>
,我使用了typedef
a buttonmap_t
。
Button
当我(在Controller
构造函数中)创建新实例时,构造Button
函数将这些Button
s 的类型注册到映射中。
控制器.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.* 文件中。
这似乎与以下问题有些相关(但不完全相同):