2017-09-16 107 views
1

我的C++程序我有很多類,其中一個成員應該是兩種類型之一,它們具有相同的基類。基類與派生成員的唯一指針

我以爲我可以用指針實現這個,但我沒有得到它的工作。

實施例,例如,假設我們有一個A類與B類的成員B_:

class A{ 
public: 
    A(B b): b_{b} {} 
private: 
    B b_; 
} 

中的B類只有一個功能至極是純虛:

class B{ 
public: 
    virtual void print() = 0; 
} 

現在我有兩個B和I的派生類想要以某種方式更改A,以便它可以容納B1或B2類的八個對象:

class B1: public B{ 
public: 
    void print(){cout << "B1\n";} 
}  

class B2: public B{ 
public: 
    void print(){cout << "B2\n";} 
} 

我的計劃是使用獨特的指針:

class A{ 
public: 
    A(std::unique_ptr<B> b): b_{std::move(b)} {} 
private: 
    std::unique_ptr<B> b_; 
} 

int main(){ 

std::unique_ptr<B> b; 
if (some condition){ 
    b = make_unique<B1>(new B1()) ///? 
}else{ 
    b = make_unique<B2>(new B2()) ///? 
} 
A(b); 
A.getB()->print(); 
} 
+1

'b = make_unique (new B1())'??? ... **你的意思是**'b = make_unique ()'? – WhiZTiM

+0

什麼是錯誤? – MKR

回答

2

您的代碼有幾處錯誤。首先,你不能有兩個定義A。其次,您必須通過unique_ptr作爲r值參考(std::move),因爲它不可複製。最後,創建一個類型爲Aa)的變量,然後調用它的方法。

#include <memory> 
#include <iostream> 

using namespace std; 

class B{ 
public: 
    virtual void print() = 0; 
    virtual ~B() {}; 
}; 

class B1: public B{ 
public: 
    void print(){cout << "B1\n";} 
}; 

class B2: public B{ 
public: 
    void print(){cout << "B2\n";} 
}; 

class A{ 
public: 
    A(std::unique_ptr<B> b): b_{std::move(b)} {} 
    auto *getB() { return b_.get(); } 
private: 
    std::unique_ptr<B> b_; 
}; 

int main() 
{ 
    std::unique_ptr<B> b; 
    if(false) 
     b = make_unique<B1>(); 
    else 
     b = make_unique<B2>(); 

    A a(std::move(b)); 
    a.getB()->print(); 
} 
相關問題