2014-07-14 44 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]);