2015-10-21 150 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是正確的,你可以轉發聲明類,但是當你引用這個類時,它必須是一個指針或引用,而不是對象本身:因此'Card *'有效,但不是'Card' –

回答

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

我假設你列入Player.h文件Card.h頭使用#include "Card.h"指令

但是,如果你沒有那麼被告知std::vector<T>需要它的參數是一個完整的類型,並且不能將正向聲明類型作爲其模板參數傳遞。

這裏是另外一個問題/答案是明確您的問題:使用對象類型本身不是當When can I use a forward declaration?