2014-03-31 57 views
2

嗨我是一個初學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 ::陳」和「」)。於是,我就刪除「=」和寫OBJ1 ::初始化這樣

myarrayAction[3] { 
    {&Obj::doNothing, OffState}, 
    {&Obj_1::GoToInitState, InitState}, 
    {&Obj_1::GoToRunState, RunState}, 
}; 

但我有一個sintax error..Any想法? 謝謝

+0

我不喜歡的語法,但它看起來像你試圖將三個值設置爲一個數組元素..嘗試取出[3]而不是= – CheeseConQueso

回答

2

一些事情。首先,執行Obj_1::init()時,myarrayAction已由構造函數初始化。 { }語法(適用於某些數組初始化)在這裏不起作用。您需要=右側的對象(不是初始化程序列表)。第二,看起來您想要Obj_1::init()Obj::Tran對象中的所有三個對象的內容設置爲myarrayAction。但是當你開始這樣的陳述時,它將嘗試設置陣列成員myarrayAction[3],即陣列myarrayAction(其前三個成員爲myarrayAction[0]myarrayAction[1],myarrayAction[2])的第四個成員。但是這個數組只有三個成員。

你最好寫的是這樣的:

myarrayAction[0] = ... ; 
myarrayAction[1] = ... ; 
myarrayAction[2] = ... ; 

...部分你打電話,你想在這三個位置來存儲三個對象的構造函數,傳遞你想要的值參數這些構造函數中的每一個。

你可以做的另一件事是,而不是使用Obj::Tran*來表示一個Obj::Tran數組,實際上使用一個類來實現這個數組。例如,如果您知道STL,則可以編寫std::vector<Obj::Tran>。或者你可以寫你自己的班級,這取決於你想要什麼。如果你編寫了一個類,你也可以編寫一個構造函數,它將你想要的值列表作爲參數,儘管你無法像嵌套數組初始值列表一樣將它們組織到嵌套{ }的子列表中。

+0

對不起,只知道我是否理解你的答案..當你說你需要一個對象(不是初始化列表)的右邊= ..你打算我必須定義另一個類? – user3481693

+0

如果你想寫'myarrayAction =',那麼是的,我認爲你需要另一個類。如果你只是想嘗試第一個建議,'myarrayAction [0] ='等,那麼你已經定義了需要放在'='右邊的類。它是'Obj :: Tran'。 –

+0

啊,剛剛意識到'Obj :: Tran'被聲明爲'struct',而不是'class'。但就C++編譯器而言,'struct'是一種只有少數差異的類。你仍然可以爲它實現一個構造函數。 (或者可能有一個編譯器生成的構造函數用於你想要的;我總是實現我想要的作爲樣式的構造函數,所以我不記得編譯器會提供什麼,否則。) –

相關問題