2015-02-09 64 views
2

我知道在C#中有一種方法可以讓一個變量取值,只要它們共享一個基類,但我很難用C++。我正在嘗試做什麼?我該如何獲得一個向量來使用相同的基類在兩個不同的類中?

這是我的代碼如下所示:

class BaseClass 
{ 
    public: 
     virtual void Setup() = 0;  
     virtual void DisplayText() = 0; 
}; 

class A: public BaseClass 
{ 
    public:  
     void Setup();  
     void DisplayText(); 
}; 

class B: public BaseClass 
{ 
    public:  
     void Setup();  
     void DisplayText(); 
}; 


//main.cpp 

A a; 
B b; 

std::vector<BaseClass> vector = std::vector(); 

void main() 
{ 
    vector.push_back(a); 
    vector.push_back(b); 

    for_each (vector.begin(), vector.end(), vector.Setup()); 

    return 0; 
} 

與我有什麼,現在雖然它給我這個錯誤,當我嘗試運行此:

IntelliSense: no instance of overloaded function 
"std::vector<_Ty,_Alloc>::push_back [with _Ty=BaseClass,,Alloc=std::allocator<BaseClass>]" 
matches the argument list 
argument types are: (A*) 
object type is: std::vector<BaseClass, std::allocator<BaseClass>> 
+0

我不知道它是否會工作,但嘗試創建智能指針,而不是原始對象,這些推入載體。 – adam10603 2015-02-09 00:30:32

+0

在C++中,void main()不是標準的,它應該更正爲int main()。 – cbel 2015-02-09 00:58:02

+0

@ adam10603什麼是智能指針? – SyntaxIsEvil 2015-02-09 01:44:49

回答

7

這裏有很多錯誤。第一:

std::vector<BaseClass> vector = std::vector(); 

這是無效的語法,vector不是一個類型,因此喜歡你的右手邊你不能創建一個。只是這足以:

std::vector<BaseClass> vector; 

第二,這是不是你叫for_each

for_each (vector.begin(), vector.end(), vector.Setup()); 

上有vector沒有Setup()功能。如果有的話,那甚至不是你想要打的Setup。你想使用什麼是std::mem_fun

for_each (vector.begin(), vector.end(), std::mem_fn(&BaseClass::Setup)); 

一旦我們到達那裏,然後我們得到的主要問題在你的代碼:你slicing你所有的物體!那麼,首先,我們試圖按值存儲抽象類vector,這是不可能的。如果是這樣,由於切片問題,它不會做你想要的東西。你需要做的是改變你的vector存儲指針代替BaseClass

std::vector<BaseClass*> vector; 
vector.push_back(&a); 
vector.push_back(&b); 

然後,只有到那時,將你的代碼編譯。那麼,假設你在某處提供了虛擬覆蓋的定義 - 否則它不會鏈接。

+0

是否可以使用給定向量的類型名稱的引用? – Mark 2015-02-09 00:38:36

+2

@Mark你的意思是'矢量'?不可以。元素類型必須是可分配的。 – Barry 2015-02-09 00:39:47

+0

@Barry我現在大部分都是你寫的。我需要做一些改變。我想將基類中的矢量作爲靜態值,我需要在我的主類中調用它。但問題是它給了我這個鏈接器錯誤:錯誤LNK2001:無法解析的外部符號「public:static class std :: vector > BaseClass :: vector」(? s_Screens @ GameScreens @@ 2V?$ vector @ PAVGameScreens @@ V?$ allocator @ PAVGameScreens @@@ std @@@ std @@ A) 如何解決? – SyntaxIsEvil 2015-02-09 02:09:24

0
  1. 刪除= std::vector();這是不需要
  2. 請將初始化代碼A a; B b; std::....轉換爲main函數。
  3. 您的for_each也是錯誤的。
  4. 我不知道C++要做什麼,如果sizeof(BaseClass)爲零。

我認爲你隱藏了太多的代碼:什麼是GameScreens

+1

'sizeof(BaseClass)'不爲零。 – Barry 2015-02-09 00:33:19

+0

我不知道for_Each如何在C++中工作。我只是把它作爲我希望它做的一個例子。 GameScreens只是BaseClass。我錯過了呼叫 – SyntaxIsEvil 2015-02-09 00:36:36

+0

,您可以保存'boost :: function '對象,而不需要基本類。 – Aitch 2015-02-09 00:40:57

4

是的,這是可行的。你需要改變你的向量,以保持指針BaseClass*

std::vector<BaseClass*> vector; 

vector.push_back(&a); 
vector.push_back(&b); 

void DoSetup(BaseClass *obj) 
{ 
    obj->Setup(); 
} 

for_each (vector.begin(), vector.end(), DoSetup); 
相關問題