2008-10-05 61 views
4

在實現了策略模式後,我想創建一個接口類型的數組,然後我可以添加任何具體類型。C++策略設計模式,製作一個接口陣列

對於那些誰也不知道的策略模式: http://en.wikipedia.org/wiki/Strategy_pattern 在這個特殊的例子,我希望做一個StrategyInterface陣列,我可以再與具體類型的A,B和C.然而填補,因爲這是一個抽象類,我無法完成它。有沒有辦法做到這一點,或者完全不可能,沒有刪除抽象方法?

+0

即使您可以製作接口的數組/矢量,您也會遇到對象切片的問題。所以使用指針的另一個原因。 – 2008-10-05 21:15:54

回答

2

存儲指針不是對象.....使用boost :: shared_ptr如果你想存儲對象。

6

使數組指針存儲接口類型:

typedef std::vector<Interface *> Array; 
Array myArray; 
myArray.push_back(new A()); 

此外,還可以使用ptr_vector其管理的內存爲您提供:

typedef boost::ptr_vector<Interface> Array; 
// the rest is the same 
1

errr,例如... STD: :矢量< boost :: shared_ptr < AbstractStrategy >>

+0

你可以編輯自己的原始答案 - 只需點擊「編輯」鏈接 – 2008-10-05 07:06:19

+0

優秀,這是很酷:) :) – 2008-10-05 07:07:35

1

使用boost有什麼用處?

下面是它會是什麼樣子

#include <list> 
#include <boost/any.hpp> 

using boost::any_cast; 
typedef std::list<boost::any> many; 

void append_int(many & values, int value) 
{ 
    boost::any to_append = value; 
    values.push_back(to_append); 
} 

void append_string(many & values, const std::string & value) 
{ 
    values.push_back(value); 
} 

void append_char_ptr(many & values, const char * value) 
{ 
    values.push_back(value); 
} 

void append_any(many & values, const boost::any & value) 
{ 
    values.push_back(value); 
} 

void append_nothing(many & values) 
{ 
    values.push_back(boost::any()); 
} 

看上去不錯,優雅的例子,再加上你得到很好的測試代碼,並作爲替代對象的指針

注可以把你的價值觀:這些函數名信息豐富,但您可以使用覆蓋來擁有一個界面。