我有一些設計問題,我想你們中的一個可能有一些線索來幫助我。使用boost :: shared_ptr的set中的不同模板類class =「#」#:
我想總結一下我的問題這個簡單的例子:
我有兩個不同的類DerivedOne
和DerivedTwo
從同一Base
類繼承和共享方法的定義。
我有一套shared_ptr
指向client
,其中有一個對象來自兩個不同的類DerivedOne
和DerivedTwo
。
因爲我不想用Base*
指針來保存這2個不同的類,所以我嘗試製作客戶端類模板。
但是我有兩個不同的班級,我不能在同一組中持有他們。
我認爲shared_ptr
可以容納一個對象指針而不指定模板參數,但我錯了,或者我不知道該怎麼做。
另一種解決方案我看到的,是預先分離的那些2個不同client
在2個不同的set
感謝您的任何建議。
下面是代碼:
#include <iostream>
#include <set>
#include <boost/shared_ptr.hpp>
class Base
{
public:
virtual void test() = 0;
};
class Derived_one
: public Base
{
public:
void test() {
std::cout << "Derived One" << std::endl;
}
};
class Derived_two
: public Base
{
public:
void test() {
std::cout << "Derived Two" << std::endl;
}
};
template <class temp_arg>
class Client
{
public:
int test(){
obj_.test();
}
protected:
temp_arg obj_;
};
typedef Client<Derived_one> ClientOne;
typedef Client<Derived_two> ClientTwo;
/// Here I don't want to specify any of the two previously declared client :
//typedef boost::shared_ptr<Client> Client_ptr;
typedef boost::shared_ptr<ClientOne> Client_ptr;
int main(int, const char**)
{
std::set<Client_ptr> Clients_;
Client_ptr client_(new ClientOne());
Clients_.insert(client_);
client_->test();
return 0;
}
如果你想給看向真正的代碼:
https://github.com/gravitezero/Node/tree/experimental/src
Client
對應connection
的Base
類是message
兩個派生類是peply
和request
。
爲什麼你不想使用Base指針,它可能指向派生類對象? –
由於某些原因,我不想使用指針。 其中之一是我不想'dynamic_cast',並且這個指針可能會變成'dynamic_cast'。 此外,我想要一個組合,而不是客戶端和派生對象之間的聚合。 – etnbrd
@EtienneBrodu如果你需要一個'dynamic_cast',你的設計在另一個地方出了問題,但是在你給我們展示的那個地方沒有。指針是一個非常合理的決定。 – pmr