2010-11-14 146 views
0

我期待着指出正確的方向。 我有1類的事件指針幫助,指向對象的指針和類

class Event{ 
private: 
vector<string> Question; 
char Mode;// 1 = Ascending 2 = Descending 3 = None 
string EventName; 
public: 
    Event(string Name){ 
     EventName = Name; 
     SetQuestionSize(); 
     SetQuestion(); 
     Mode = 3; 
    } 

    void SetName(string NewName){ 
     EventName = NewName; 
    } 
    void SetQuestionSize(){ 
     Question.resize(15); 
    } 

    int ReturnQuestionSize(){ 
     return Question.size(); 
    } 

    void SetQuestion(){ 
     Question[0]="Enter "; 
     Question[1]="1 "; 
     Question[2]="to "; 
     Question[3]="sort "; 
     Question[4]="in "; 
     Question[5]="ascending "; 
     Question[6]="order, "; 
     Question[7]="2 "; 
     Question[8]="for "; 
     Question[9]="Descending, "; 
     Question[10]="or "; 
     Question[11]="3 "; 
     Question[12]="to "; 
     Question[13]="ignore "; 
     Question[14]=EventName; 
    } 

    string ReturnQuestion(int Index){ 
     return Question[Index]; 
    } 

    /*vector<string> ReturnQuestion(){ 
return Question; 
    }*/ 

    void SetMode(char NewMode){ 
if (NewMode == '0' || NewMode == '1' || NewMode == '2') 
Mode = NewMode; 
} 

    char ReturnMode(){ 
return Mode; 
    } 

    string ReturnName(){ 
     return EventName; 
    } 
}; 

這是將是第二對象的成員,這將使用事件的函數來存儲在事件的成員的數據。

我遇到的問題是在我的第二個對象中聲明一個Event對象的數組。當研究我遇到了使用指向第一個對象的指針數組的方法時,我猜測一些運算符' - >'與虛函數有關。

class WhatTheyWant{ 
    Event *events[2]; 
public: 
    WhatTheyWant(){ 
     events[0]= new Event("Miss"); 
     events[1]= new Event("Dodge"); 
    } 
}; 

我指點一下很無知,我知道我最終還是不得不學習他們,但他們是去還是有更好的最佳途徑。

+0

我不知道該網站的格式化,但假設事件包括載體串庫和WhatTheyWant包括事件 – Malaken 2010-11-14 17:00:03

回答

1

由於您的Event類沒有默認的構造函數,因此您需要使用它的名稱顯式構造每個對象,因此您目前的做法是唯一的方法。

如果添加一個默認的構造函數Event,你可以做到這一點在其他至少有兩種方式:

如果你總是有對象的(小)的固定號碼,你可以聲明的常量數組大小:

Event events[2]; 

這樣做會自動構造的對象被創建時WhatTheyWant,所以你只需要事後設置名稱:

WhatTheyWant() { 
    events[0].SetName("Miss"); 
    events[1].SetName("Dodge"); 
} 

如果你想有一個可變數量的事件,你可以聲明一個指針,並動態分配對象的數組:

Event *events; 

而且你也許可以給出數字作爲參數的構造函數:

WhatTheyWant(int numEvents) { 
    events = new Event[numEvents]; 
    for (int i = 0; i < numEvents; i++) 
    events[i]->SetName("..."); 
} 

此外,不直接關係到你的問題,但你的Mode變量將使用枚舉而不是char得到更好的建模。使用enum使得它更清楚,以什麼變量的真正含義,而不是使用如0,1和2的值例如:

public: 
    enum ModeType { Ascending, Descending, None }; 
private: 
    ModeType Mode; 
public: 
    Event() { 
    ... 
    Mode = Ascending; 
    } 
    void SetMode(ModeType NewMode) { 
    Mode = NewMode; 
    } 
    ModeType ReturnMode() { 
    return Mode; 
    } 
+0

謝謝我現在正在查找枚舉。 如果我想創建第三個對象,在這第二個動作,WhatTheyWant,對象我必須添加mutator和訪問函數WhatTheyWant? 這些mutator和accessor函數大部分是訪問Event的mutator&accessor函數嗎? – Malaken 2010-11-14 17:27:33

+0

@Malaken:是的,可能。這又取決於你想要做什麼。 – casablanca 2010-11-14 17:29:34

-1

在C++中,指針就像在WhatTheyWant級陣列

,可以定義私有成員:

Event *events[2]; 

這是陣列(二維陣列)具有可變長度的陣列(陣列的)和每個陣列中的2個元素。

和操作者的「 - >」時要訪問一個(一些類型的對象的部件)使用,並且被稱爲一個對象的指針(其指向的對象的指針),但是當你定義一個正常對象變量你使用'。'運營商。

如果您有足夠的勇氣和知識來使用它們,那麼它們非常有用,但通常它們很危險,這就是爲什麼新語言傾向於採用管理方式。

+2

-1:這是一個充滿後定型和城市的神話。指針實際上不像數組。一般來說它們並不危險。 – 2010-11-14 17:17:24

+0

謝謝你的解釋。 「這是一個陣列(二維數組)陣列(陣列長度可變)和每個陣列中有兩個元素。」再加上這個例子幫助了我以前無法理解的信息點擊。 – Malaken 2010-11-14 18:09:57

0

可以使用對象或指針數組的任一陣列。

對象的數組如下所示。

class WhatTheyWant{ 
    Event events[2]; 
public: 
    WhatTheyWant() 
    { 
     events[0] = Event("Miss"); 
     events[1] = Event("Dodge"); 
    } 
}; 

注:您需要添加默認構造函數到您的事件類來編譯上述方法。

通過上述方法,您無需考慮釋放事件對象。每當WhatTheyWant對象被破壞時,事件對象就會被銷燬。

指針數組的方法就像你提到的那樣。

但你需要照顧釋放分配的內存(除非你使用auto_ptr或一些C++ 0x等價物)。 刪除應該發生在像下面這樣的析構函數中。

class WhatTheyWant{ 
    Event *events[2]; 
public: 
    WhatTheyWant(){ 
     events[0]= new Event("Miss"); 
     events[1]= new Event("Dodge"); 
    } 
    ~WhatTheyWant() 
    { 
     delete events[0]; 
     delete events[1]; 
    } 
}; 
+0

謝謝我會改變我的事件類的默認構造函數,並嘗試使用一組對象,並讓你都知道結果 我猜 - 在類名稱使它成爲析構函數之前? – Malaken 2010-11-14 18:05:39

+0

@Malaken:是的,它是析構函數的語法。 – bjskishore123 2010-11-14 18:37:35