2016-01-27 197 views
0

我有兩個類B和C(無論從類A衍生)的一類稱爲爲h,它持有A或B.根據構造函數中的參數創建內部對象?

代碼:

class A // abstract base class 
{ 
    // bells and whistles 
    // virtual fn 
    void fn() = 0 ; 
    protected: 
     // some variables common to B and C 
}; 

class B : public A // inherit from A... 
{ 
     B(); 
     fn(); // implement virtual function 
     // bells and whistles 
}; 

B::B() :A() 
{ 
// things 
} 

void B::fn() 
{ 
// things 
} 

// Class C : exactly the same as class B 


// Class H : holds B or C 
enum class CLASS_TYPE { TYPE_B, TYPE_C } 

class H 
{ 
    public: 
     H(CLASS_TYPE type_); 
     ~H(); 
    private: 
     A * _obj; 

}; 


H::H(CLASS_TYPE type_) 
{ 
    switch(type_) 
    { 
    case CLASS_TYPE::B: 
      _obj = new B(); 
      break; 
    case CLASS_TYPE::C: 
      _obj = new C(); 
      break; 
    } 
} 

H::~H() 
{ 
    delete _obj;// delete allocated object 
} 

這是創建內部以正確的方式一個類中的對象基於構造函數中的參數? 也正在使用抽象基類,虛擬高效?這是一個大型模擬程序的一部分,我想避免性能處罰。

謝謝。 PS:我試圖保持簡單,如果有更多的信息需要告訴。

回答

3

這是基於構造函數中的參數在類中創建內部對象的正確方法嗎?

我的第一個傾向是擺脫enum。讓該類的用戶構建一個對象並使用它來構造一個H

加入一個virtual成員函數clone()A

更改構造函數以接受A const&。使用clone()成員函數在構造函數中複製輸入對象。

將成員變量H更改爲std::unique_ptr而不是原始指針。

這裏是我的建議:

class A 
{ 
    public: 
     virtual A* clone() const = 0; 
     virtual void fn() = 0 ; 
    protected: 
}; 

class B : public A 
{ 
    public: 

     virtual A* clone() const 
     { 
     return new B; 
     } 

     B(); 
     virtual void fn(); 
}; 

B::B() : A() 
{ 
} 

void B::fn() 
{ 
} 

#include <memory> // of std::unique_ptr 
class H 
{ 
    public: 

     H(A const& a); 

     // No need to have an explicit destructor. 
     // The compiler generated destructor will do just fine. 
     // ~H(); 

    private: 
     std::unique_ptr<A> aPtr_; 
}; 

H::H(A const& a) : aPtr_(a.clone()) 
{ 
} 
0

你需要

virtual void fn() = 0 ; 
A級

void fn() override; // note: override is not strictly need but good practice 

在B類和C

而且你必須照顧複製和因爲在課堂上有一個原始指針。直接逐個成員複製將導致兩個H對象指向相同的B/C。這將是非常糟糕的。爲了安全起見,您應該刪除默認生成的副本/分配。如果可能,更好的方法是避免原始指針。

虛擬函數(多態性)的性能成本很低。另見Cost of Polymorphic calls - C++

相關問題