簡體   English   中英

boost :: shared_ptr和繼承

[英]boost::shared_ptr and Inheritance

我面臨的情況是我有一個基類的boost::shared_ptrstd::vector 在我的程序過程中,我需要將共享指針存儲到該向量中的派生類對象,並且稍后在程序中,需要檢索這些共享指針。

以下代碼說明了我的問題:

#include <iostream>
#include <vector>
using namespace std;

#include <boost/make_shared.hpp>
#include <boost/foreach.hpp>

class Base
{
public:
    virtual ~Base()
    {
    }
};
/******************************************/

typedef boost::shared_ptr< Base > BasePtr;
/******************************************/

class Derived1 : public Base
{
public:
    void derived1_test()
    {
        cout << "derived1_test" << endl;
    }
    /******************************************/
    int i1;
};
/******************************************/

typedef boost::shared_ptr< Derived1 > Derived1Ptr;
/******************************************/

class Derived2 : public Base
{
public:
    void derived2_test()
    {
        cout << "derived2_test" << endl;
    }
    /******************************************/
    int i2;
};
/******************************************/

typedef boost::shared_ptr< Derived2 > Derived2Ptr;
/******************************************/

int main()
{
    Derived1Ptr d1 = boost::make_shared< Derived1 >();
    Derived2Ptr d2 = boost::make_shared< Derived2 >();

    vector< BasePtr > v;
    v.push_back( d1 );
    v.push_back( d2 );
    BOOST_FOREACH(BasePtr bPtr, v)
    {
        try
        {
            Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );
            d11.derived1_test();
        }
        catch (const std::bad_cast& e)
        {
            Derived2& d22 = dynamic_cast< Derived2& >( *bPtr );
            d22.derived2_test();
        }
    }
    return 0;
}

在上面的代碼中,如果我更改BOOST_FOREACH的代碼

Derived1& d11 = dynamic_cast< Derived1& >( *bPtr );

Derived1Ptr d11 = dynamic_cast< Derived1Ptr >( bPtr );

,我在VS2010上得到以下編譯時錯誤

invalid target type for dynamic_cast target type must be a pointer or reference to a defined class

我的問題是我想使用boost::shared_ptr而不是引用。 其次,我使用的是dynamic_cast ,當對象引用屬於不同類型時會拋出std::bad_cast異常(嘗試使用它與共享指針但是得到前面提到的編譯器錯誤)。 這顯然非常緩慢。 我希望能夠使用更加注重績效的方法。 我在這里尋找的是任何解決方案,而不是使用dynamic_cast和異常處理。

歡迎任何關於代碼或設計變更的建議。

你的設計似乎忽略了這一點; 使用virtual函數來實現多態行為會更好。

#include <iostream>
#include <vector>
using namespace std;

#include <boost/make_shared.hpp>
#include <boost/foreach.hpp>

class Base
{
public:
    virtual ~Base() {}
    virtual void test() = 0;
};
/******************************************/

typedef boost::shared_ptr< Base > BasePtr;
/******************************************/

class Derived1 : public Base
{
public:
    void test()
    {
        cout << "derived1_test" << endl;
    }
    /******************************************/
    int i1;
};

class Derived2 : public Base
{
public:
    void test()
    {
        cout << "derived2_test" << endl;
    }
    /******************************************/
    int i2;
};

int main()
{
    BasePtr d1 = boost::make_shared< Derived1 >();
    BasePtr d2 = boost::make_shared< Derived2 >();

    vector< BasePtr > v;
    v.push_back( d1 );
    v.push_back( d2 );
    BOOST_FOREACH(BasePtr &bPtr, v) // I use a reference here for efficiency.
    {
        bPtr->test();
    }
    return 0;
}

如果你的向量擁有對象,你最好使用boost::ptr_vector

你有幾個選擇:

正確使用繼承(和多態)! 即在您的派生類中實現的基類中定義純虛方法(同樣,每個派生類型的額外shared_ptr類型也是多余的!)

使用變體類型來保存所有派生類型(如果您具有有限的集合,則非常有用)。 那么就不需要動態強制轉換,您可以指定訪問者來執行您需要的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM