2014-07-14 70 views
0

陣列我有下面的頭文件表對象:聲明對象以恆定的可變

#ifndef TABLE_H 
#define TABLE_H 
#include "Order.h" 
#include "Waiter.h" 

//     0  1  2  3 
enum TableStatus { IDLE, SEATED, ORDERED, SERVED }; 

class Waiter; // to take care of circular reference. 

class Table 
{ 
private: 
    int tableId;  // table number 
    const int maxSeats; // table seat capacity 
    TableStatus status; // current status, you can use assign like 
       // status = IDLE; 
    int numPeople;  // number of people in current party 
    Order *order;  // current party's order 
    Waiter *waiter;  // pointer to waiter for this table 

public: 
    Table(int tblid =0, int mseats = 0); // initialization, IDLE 
    void assignWaiter(Waiter *person); // initially no waiter 
    void partySeated(int npeople);  // process IDLE --> SEATED 
    void partyOrdered(Order *order); // process SEATED --> ORDERED 
    void partyServed(void);   // process ORDERED --> SERVED 
    void partyCheckout(void);  // process SERVED --> IDLE 
    int getMaxSeats(void); 
    int getStatus(void); 
}; 
#endif 

在我的主要功能,我需要聲明表的陣列。但是當我寫,比如Table * table = new Table [10]時,數組中的每個元素都會在構造函數中調用默認參數,並且每個表的最大座標值都是0,我需要能夠分別調用其每個構造函數以爲maxSeats設置不同的值。

到目前爲止唯一能夠提出的解決方案是聲明一個指向表對象的指針數組,然後分別實例化每個指針。這部分工作,但在上面的代碼中提到的Waiter類接受一個表數組作爲參數,並且如果它傳遞了一個表指針數組將不會工作。

我可以執行哪個過程來結束具有不同maxSeats常量變量值的Table對象數組?

還有一點需要澄清:數組必須動態創建,所以我不能明確地對構造函數進行10次或多次調用。我事先不知道陣列的大小是多少。

+0

'班級服務員;'這裏不好,Waiter.h至少應該做班級服務員。 –

回答

0

可以在這種特殊情況下使用placement new,但不要忘了手動破壞你的對象,並取消分配與operator delete[]的原始內存:(如果你不這樣做,你的程序有不確定的操作)

這是一個新的安置處理數組對象的小例子:

#include <new> 

class MyClass 
{ 
    public: 
     MyClass(int i) : p(i) {} 
    private: 
     int p; 
}; 

int main(int argc, char** argv) { 

    // Allocate a raw chuck of memory 
    void* buff10 = operator new[](sizeof(MyClass) * 10); 

    MyClass * arr = static_cast<MyClass*>(buff10); 

    // Construct objects with placment new 
    for(std::size_t i = 0 ; i < 10 ; ++i) 
    new (arr + i) MyClass(i); 

    // Use it ... 

    // Then delete : 

    for(std::size_t i = 9 ; i >= 0 ; --i) 
     arr[i].~MyClass(); 

    operator delete[] (arr); 

    return 0; 
} 
0

不可能用new來做到這一點。但是你不應該使用new。改爲使用vector。之前,C++ 11它不能真正應付const成員,但在C++ 11,你有一些選擇:

std::vector<Table> table = { 
    { 1, 1 }, {2, 2}, {3, 3}, /* etc. */ }; 

或者,您可以通過一個加一個:

std::vector<Table> table; 
table.emplace_back(Table(1, 1)); 
table.emplace_back(Table(2, 2)); 

由於你的班級包含一個const,這使得它不可複製。但它仍然是MoveConstructible。


注:這可能會讓事情更容易在這裏,如果你沒有一個const類的成員,只是不停地private,並不會改變它。

此外,根據您對orderwaiter所做的操作,默認的移動構造函數可能不會做正確的事情。如果這些指向由表「擁有」的資源,那麼您將不得不正確地管理這些資源,或者編寫自己的移動構造函數。

+0

不幸的是,這是一項家庭作業,而變量不變是原始作業的一部分。該任務還規定,矢量不允許。如果我從頭開始做這件事,那會比較簡單。 – GoMeteoroGo

+0

結合規定「在編譯時未知的數組大小」,除了放置新元素之外,沒有其他解決方案。你有沒有在課堂上介紹過新的貼子?對我來說,似乎不太可能,一門課程將禁止使用矢量,並期望使用新的替代方法。 (雖然C++課程要求你使用C風格的數組而不是C++風格的數組,但是這會是另一個級別),這很常見 - 儘管仍然很可怕 - –

+0

有可能你誤解了需求爲'maxSeats'爲'const'? –

1

一種選擇是使用placement new

Table* tables = static_cast<Table*>(new char[sizeof(Table) * count]); 
for(int i = 0; i < count; i++) new(&tables[i]) Table(tblid[i], mseats[i]);