2015-10-21 5 views
0

У меня есть класс игрока, который содержит переменную экземпляра: \Вектор неизвестен размер

vector<Card> userCards; 

Для того, чтобы избежать каких-либо ошибок компиляции я жду заявленным класс Card. Однако сейчас, когда я пытаюсь построить решение, я получаю сообщение об ошибке

Карточка *: Неизвестный размер.

В принципе я пытаюсь создать Player, который содержит не фиксированное количество карт, поэтому я попытался с помощью вектора, и теперь я не могу заставить его работать.

Player.h

#include <iostream> 
#include <vector> 

using std::string; 
using std::vector; 

#ifndef PLAYER_H_ 
#define PLAYER_H_ 

class Card; 
class Player { 
private: 
    vector<Card> userCards; 
}; 
#endif 

Card.h

#include <iostream> 

using std::string; 

#ifndef CARD_H_ 
#define CARD_H_ 

class Card { 
private: 
    string name; 
    string type; 

public: 
    Card(const string& name, const string& type); 
}; 
#endif 

У меня есть куча различных функций, которые не связаны между собой, так что я не включил их.

+0

декларация Вперед может быть использована только с указателями, а не при использовании самого типа объекта. – Barmar

+1

@Barmar не соответствует действительности, декларации классов могут использоваться для различных целей –

+0

@M.M По моим сведениям, Barmar прав, вы можете переслать объявление класса, но когда вы обратитесь к этому классу, он должен быть указателем или ссылкой, а не объектом сам по себе: таким образом, «Карточка» работает, но не «Карточка» –

ответ

3

Аргумент шаблона типа std::vector не может быть неполным. Он должен быть определен (полностью) до создания экземпляра std::vector<Card>. Для этого замените свою декларацию class Card; на #include "Card.h".

Вы можете увидеть дальнейшие требования к аргументам шаблона here.

2

Вектор не должен знать, сколько карточек вы хотите хранить, но должно знать размерCard.

Так что не отправляйте объявление, но #include Card.h.

2

vector<Card> необходимо просмотреть полное объявление Card. Существуют некоторые определенные функции, необходимые для создания экземпляра.

Вы можете сделать что-то вроде

vector<unique_ptr<Card>> userCards; 

, хотя, который ведет себя как любой указатель (ссылка) декларации, и принимает вперед декларацию.

3

Я предполагаю, что вы включили Card.h заголовка в файлеPlayer.h используя #include "Card.h" директиву

, но, если вы не затем сообщили, что std::vector<T> требует его параметра, чтобы быть полным type, и вы не можете передать форвардный объявленный тип в качестве аргумента шаблона.

Вот еще один вопрос/ответ, который проясняет проблему: When can I use a forward declaration?

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