2015-04-04 2 views
0

У меня есть три файла .cpp: Game, Guesser и Provider. Каждый из файлов заголовков для них содержит соответствующее объявление класса.Инициализация ссылочных переменных в списке инициализации

В моем классе игры мне нужны частные переменные для Guesser и Provider.

Guesser имеет конструктор не по умолчанию

Guesser::Guesser (int wordLength, const char* wordListFilename){}

поэтому я должен инициализировать его через список инициализации на конструкторе игры.

То, что я до сих пор:

Guesser& guesser;

Provider& provider;

`Game::Game(int& wordLength, const char* filename, const Provider& providr) : guesser(wordLength, filename),provider(providr) 
{ 
    numMissedGuesses = 0; 
    wordSoFar = string(wordLength, FILL_CHARACTER); 
}` 

Этот код не компилируется, и я потерял куда идти отсюда.

Сообщения об ошибках компилятора:

|| === Сложение: Отладка в adthangman (компилятор: GNU GCC компилятора) === |

ошибка: «гадание» объявлено как ссылка, но не инициализировано |

ошибка: «поставщик» объявлен как ссылка, но не инициализирован |

В конструкторе 'Game :: Game (int, const char *, const Provider &)': |

ошибка: список выражений рассматривается как составное выражение в mem-initializer [-fpermissive] | предупреждение: левый операнд оператора запятой не действует [-Унимое значение] |

ошибка: недействительная инициализация ссылки типа «Guesser &» из выражения типа «const char *» |

ошибка: недействительная инициализация ссылки типа «Поставщик &» из выражения типа «const Provider» | || === Сбой сборки: 5 ошибок, 1 предупреждение (ы) (0 минута, 0 секунд (ы)) === |

Любая помощь очень ценится.

+2

'угадывание' не должно быть ссылкой. – 0x499602D2

+0

Я не могу объявить это каким-либо другим способом, не получив ошибку, что я не встречал формат конструктора. – James

+1

Отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –

ответ

0

guesser и provider должны быть объявлены внутри области class Game { }, если они должны быть инициализированы конструктором.

Вы не можете инициализировать ссылку на объект класса, предоставляя аргументы конструктору своего класса. Ссылки должны быть инициализированы ранее существовавшим объектом. (Не-членные ссылки также могут быть инициализированы временными объектами, но это немного отличается.)

Кроме того, ссылочные элементы часто представляют собой красный флаг для дизайна классов. Возможно, вы захотите использовать обычные объекты-члены для guesser и provider вместо ссылок.

class Game { 
    Guesser guesser; 
    Provider provider; 
}; 
+0

Угадайщик и провайдер объявлены внутри класса Game, и они должны быть закрытыми. Я получаю« класс «Игра», не имеет поля с именем «поставщик». – James

+0

@James Я представил пример объявления объектов как членов класса. Это то, что у вас есть, потому что все описанные вами симптомы указывают на отсутствие этих объявлений. Обратите внимание, что вы также не определяете их вне класса после – Potatoswatter

+0

И ошибка: поле «угадайщик» имеет неполный тип. ошибка: поданный «провайдер» имеет неполный тип. – James

0

Вы не можете использовать конструктор для объекта, являющегося ссылкой. Это само по себе не является объектом, а указывает на другой объект. Таким образом, либо передайте ссылочную опцию угадывания другого объекта угадывателя типа класса, либо измените его на регулярную переменную. Также вы не можете назначить объект const не постоянной ссылке. Сделать параметр поставщика не постоянным.

+0

Я могу создать поставщика провайдера как регулярную переменную, так как имеет конструкцию по умолчанию. Я не могу создать угадыватель Guesser как регулярную переменную, потому что он выдает ошибку «нет подходящей функции для вызова Guesser: Guesser(); – James

+1

@James Конструкция по умолчанию не должна быть проблемой. У вас уже есть аргументы конструктора, когда вызывается конструктор 'Game'. – Potatoswatter

Смежные вопросы