我是一个老 C-dude,试图通过将我的旧状态机框架从 C 移植到 C++11 来了解 C++11。我的想法是为状态机本身创建一个类,然后为其中的状态嵌套类。状态可以是分层的,即超状态和子状态。框架需要知道一个状态的超状态,为此我state *superstate
在嵌套状态类中有一个指针 ( )。
我的问题是我打算通过直接在机器类中使用构造函数来设置超状态指针,这应该可以在 C++11 中使用非静态数据成员初始化,通过使用统一初始化。substateB3{superstateA}
但是由于某种原因,当设置为另一种类型的状态/类时,它无法编译 ( )。但是,如果我稍后为此目的使用特定函数 ( set_superstate
) 来设置它,它就可以正常工作,它与构造函数具有相同的参数!有趣的是,如果我将超状态设置为相同类型的状态/类(substateB2{substateB1}
),则接受构造函数。
我正在使用 gcc 4.7.0(以获得对非静态数据成员初始化程序的支持),这是我的代码:
// My state-machine framework (simplified)
struct machine {
struct state {
state() : superstate(nullptr) { } // No superstate => toplevel state!
state(state &superstate) : superstate(&superstate) { }
state *superstate;
void set_superstate(state &superstate) { this->superstate = &superstate; } // Non-ctor way to set superstate
};
};
// An example of a specific state-machine using my framework
struct Machine : machine {
struct SuperstateA : state {
} superstateA;
struct SubstateB : state {
} substateB1, // Compiles OK; gets its superstate set in Machine's ctor below
substateB2{substateB1}, // Compiles OK; but not correct superstate
substateB3{superstateA}; // gcc 4.7.0 error: could not convert ‘{((Machine*)this)->Machine::superstateA}’ from ‘<brace-enclosed initializer list>’ to ‘Machine::SubstateB’
Machine() { substateB1.set_superstate(superstateA); } // Compiles OK;
} myMachine;
非常感谢任何提示或指导,谢谢!:)