2010-06-06 3 views
0

Я пытаюсь инициализировать следующий массив следующей структуры, но мой код не компилируется. Кто-нибудь может мне помочь?Проблема Инициализация массива структур

структуры/массив:

struct DiningCarSeat { 
    int status; 
    int order; 
    int waiterNum; 
    Lock customerLock; 
    Condition customer; 

    DiningCarSeat(int seatNum) { 
     char* tempLockName; 
     sprintf(tempLockName, "diningCarSeatLock%d", seatNum); 
     char* tempConditionName; 
     sprintf(tempConditionName, "diningCarSeatCondition%d", seatNum); 
     status = 0; 
     order = 0; 
     waiterNum = -1; 
     customerLock = new Lock(tempLockName); 
     customer = new Condition(tempConditionName); 
    } 
} diningCarSeat[DINING_CAR_CAPACITY]; 

Соответствующие ошибки:

../threads/threadtest.cc: In constructor `DiningCarSeat::DiningCarSeat(int)': 
../threads/threadtest.cc:58: error: no matching function for call to `Lock::Lock()' 
../threads/synch.h:66: note: candidates are: Lock::Lock(const Lock&) 
../threads/synch.h:68: note:     Lock::Lock(char*) 
../threads/threadtest.cc:58: error: no matching function for call to `Condition::Condition()' 
../threads/synch.h:119: note: candidates are: Condition::Condition(const Condition&) 
../threads/synch.h:121: note:     Condition::Condition(char*) 
../threads/threadtest.cc:63: error: expected primary-expression before '.' token 
../threads/threadtest.cc:64: error: expected primary-expression before '.' token 
../threads/threadtest.cc: At global scope: 
../threads/threadtest.cc:69: error: no matching function for call to `DiningCarSeat::DiningCarSeat()' 
../threads/threadtest.cc:51: note: candidates are: DiningCarSeat::DiningCarSeat(const DiningCarSeat&) 
../threads/threadtest.cc:58: note:     DiningCarSeat::DiningCarSeat(int) 

Заранее спасибо!

+0

У вас есть книга? – GManNickG

ответ

1

Там находятся несколько вопросов здесь:

Они оба должны быть указатели, так как вы new ИНГ их в конструкторе:

Lock customerLock; 
Condition customer; 

Вы не объявить тип для seatNum:

DiningCarSeat(seatNum) { 

Вы не выделять память для tempLockName или tempConditionName:

char* tempLockName; 
    sprintf(tempLockName, "diningCarSeatLock%d", seatNum); 
    char* tempConditionName; 
    sprintf(tempConditionName, "diningCarSeatCondition%d", seatNum); 
+0

Спасибо за быстрый ответ! У меня есть еще вопросы ... Я не думаю, что хочу, чтобы указатели на customerLock и клиента ... как я должен их инициализировать? Ах, я до сих пор не привык к тому, чтобы делать такие вещи, как выделение памяти, и никогда не поймал бы это сам. Благодаря! – Justin

1

Condition и Lock не имеют конструкторов по умолчанию. Для их создания вы должны использовать initialization list.

Я хотел бы изменить/добавить конструктор для Condition и Lock, чтобы они могли принять const char* и int. Тогда DiningCarSeat будет выглядеть следующим образом:

DiningCarSeat(int seatNum) : 
    status(0), 
    order(0), 
    waiterNum(-1), 
    cutomerLock("diningCarSeatLock", seatNum), 
    customer("diningCarSeatCondition", seatNum) 
{} 
+0

Значит ли это, что для классов требуются конструкторы по умолчанию независимо от того, что? Я думал, что они мне не понадобятся, потому что я их не использовал ... Что такое список инициализации? – Justin

+0

Вы можете прочитать [здесь] (http://www.cprogramming.com/tutorial/initialization-lists-c++.html) о списках инициализации. –