我一直在嘗試創建一個實體化派生類的類的復制建構式,但沒有成功。
假設我有以下純虛擬類:
class AbstractBar{
public:
virtual void printMe() = 0;
};
類Bar繼承自AbstractBar如下:
class Bar: public AbstractBar {
std::string name_;
public:
explicit Bar(std::string name) : name_ {std::move(name)}{};
void printMe() override { std::cout << name_ << std::endl; }
};
我的類Foo現在嘗試通過宣告指向型別的指標來使用多型性,AbstractClass如下所示:
class Foo{
std::unique_ptr<AbstractBar> theBar_;
public:
explicit Foo(std::unique_ptr<Bar> bar){
theBar_ = std::move(bar);
};
void printBar(){
theBar_->printMe();
}
};
但是我確實想Foo被復制,所以我添加了以下復制建構式:
Foo(const Foo &other) {
theBar_ = std::unique_ptr<AbstractBar>();
*theBar_ = *(other.theBar_);
}
這就是它崩潰的地方。
我收集到的是這可能是一個問題,因為theBar在復制建構式中認為它指向一個AbstractBar但是當我嘗試復制它指向的物件時,在下一行中,我實際上給了它一個派生Bar類。
有沒有正確的方法來實作這個復制建構式?
uj5u.com熱心網友回復:
首先,std::unique_ptr<T>確實是獨一無二的。因此,您不能期望通過復制兩個事物來指向同一個實體。也就是說,我認為您要做的是克隆該成員unique_ptr持有的任何“事物”,以允許對Foo.
如果是這種情況,您需要一個協變克隆。見下文:
#include <iostream>
#include <string>
#include <memory>
struct AbstractBar
{
virtual ~AbstractBar() = default;
virtual std::unique_ptr<AbstractBar> clone() = 0;
virtual void printMe() = 0;
};
class Bar : public AbstractBar
{
std::string name_;
public:
explicit Bar(std::string name) : name_{std::move(name)} {};
std::unique_ptr<AbstractBar> clone() override
{
return std::make_unique<Bar>(name_);
}
void printMe() override
{
std::cout << name_ << std::endl;
}
};
class Foo
{
std::unique_ptr<AbstractBar> theBar_;
public:
explicit Foo(std::unique_ptr<Bar> bar)
: theBar_(std::move(bar))
{
}
Foo(const Foo &other)
: theBar_(other.theBar_->clone())
{
}
void printBar()
{
theBar_->printMe();
}
};
int main()
{
Foo foo(std::make_unique<Bar>("Some String"));
Foo bar(foo);
foo.printBar();
bar.printBar();
}
重要提示:每個人foo都bar將通過指向 的抽象基的唯一指標擁有自己的Bar實體Bar,即AbstractBar. 希望那是意圖。這不是唯一的方法,但它可能是最容易理解的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430732.html
