不匹配运营商' ='

时间:2014-03-31 15:30:09

标签: c++

您好我是一名初学者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错误..任何想法? 感谢

1 个答案:

答案 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>。或者你可以写自己的课程,这取决于你想要什么。如果你编写一个类,你也可以编写一个构造函数,它将你想要的值列表作为参数,尽管你不能像使用数组初始化列表那样将它们组织成嵌套{ }的子列表。