您好我是一名初学者C ++开发人员。我发布的代码存在问题,因此更容易理解问题。
Obj.h
class Obj : public QObject
{
Q_OBJECT
public:
typedef void (*factionState)();
struct Tran {
factionState Action;
unsigned int nextState;
};
void processAction(myState)
{
Tran const*t = myarrayAction + myState
*(t->action)();
myState=t->nextState;
}
private:
Tran const *myarrayAction;
unsigned int numStates;
protected:
myObj;
myState;
public:
Obj (Tran *arrayAction, const int nStates, const int i) {arrayAction=myarrayAction, numStates = nStates;};
void doNothing(){printf ("Do NOthing called\n")};
Obj_1.h
#include "Obj.h"
const int Obj_1=1
class Obj_1 : public Obj
{
private:
typedef enum {
OffState,
InitState,
RunState,
}state ;
static Obj::Tran myarrayAction[3];
public:
Obj_1() : Obj(myarrayAction, 3, Obj_1) {myState=OffState, myObj=Obj_1,init();};
private:
void init();
void GoToInitState();
void GoToRunState();
};
Obj_1.cpp
void Obj_1::init()
{
myarrayAction[3] = {
{&Obj::doNothing, OffState},
{&Obj_1::GoToInitState, InitState},
{&Obj_1::GoToRunState, RunState},
};
}
void Obj_1::GoToInitState()
{
// code;
}
void Obj_1::GoToRunState()
{
// code;
}
当我构建代码时出现此错误:
不匹配'运营商=' (操作数类型是' Obj :: Tran'和'')。所以我试图删除' ='并写这样的Obj1 :: init
myarrayAction[3] {
{&Obj::doNothing, OffState},
{&Obj_1::GoToInitState, InitState},
{&Obj_1::GoToRunState, RunState},
};
但我有一个sintax错误..任何想法? 感谢
答案 0 :(得分:2)
有几件事。首先,当Obj_1::init()
执行时,myarrayAction
已由构造函数初始化。适用于某些数组初始化的{ }
语法在这里不起作用。您需要=
右侧的对象(不是初始值设定项列表)。
其次,看起来您希望Obj_1::init()
设置Obj::Tran
内所有三个myarrayAction
对象的内容。但是当你启动这样的语句myarrayAction[3] =
时,它将尝试设置数组成员myarrayAction[3]
,即数组myarrayAction
的第四个成员(其前三个成员)是myarrayAction[0]
,myarrayAction[1]
,myarrayAction[2]
)。但是这个阵列只有三个成员。
你最好写这样的东西:
myarrayAction[0] = ... ;
myarrayAction[1] = ... ;
myarrayAction[2] = ... ;
在...
部分中,调用要存储在这三个位置的三个对象的构造函数,将所需的值传递给每个构造函数的参数。
您可以做的另一件事是,实际上使用类来实现此数组,而不是使用Obj::Tran*
来表示Obj::Tran
的数组。如果你知道STL,你可以写std::vector<Obj::Tran>
。或者你可以写自己的课程,这取决于你想要什么。如果你编写一个类,你也可以编写一个构造函数,它将你想要的值列表作为参数,尽管你不能像使用数组初始化列表那样将它们组织成嵌套{ }
的子列表。