gpt4 book ai didi

c++ - C++ 类/层次结构设计

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:13 25 4
gpt4 key购买 nike

我粗略的讲了下面的层级

class Base {
public:
virtual int value() const = 0;
};

class Derived1 : public Base {
public:
int value() const {
return 1;
}
};

class Derived2 : public Base {
public:
int value() const {
return -1;
}
};

class Derived3 : public Base {
public:
Derived3(const Base & underlying);
int value() const {
return underlying_.value() + 10;
}
private:
const Base & underlying_;
};

Derived3::Derived3(const Base & underlying)
:underlying_(underlying) {}

还有一个用于 Base 对象的单例持有者。工作流的一个分支是这样的:
1) 从 holder 中取出一个 Derived1 对象
2) 使用Derived1对象实例化一个Derived3对象并使用。

我在多线程环境中,担心在第二个对象的生命周期内 underlying_reference_ 变得无效的问题。我不是多线程专家,但我相信这会发生。

我希望 Derived2 对象拥有底层对象的拷贝,但因为 Base 是抽象的,所以我不能这样做。有人可以评论此设计并提出不同的方法。

补充一下,上述设计背后有两个驱动思想。 Derived3 应该被认为是 Base 类型对象的转变。一种愿望是轮类换类。另一个愿望是能够将 Derived3 对象存储在单例中以供以后使用。

最佳答案

您可以尝试“克隆”您的类(class)。我的意思是,每个派生类都可以克隆自己并在其他派生类中使用这个克隆。

class Base {
public:
virtual Base *clone() const = 0;
};

class Derived2 : public Base {
public:
int value() const {
return -1;
}
Derived2(const Derived2 &)
{
....
}
Base *clone() const
{
return new Derived2(*this);
}
};

使用此解决方案,您可以随时持有新的 Derived。不要忘记删除它。您的工厂返回一个 Base 对象,可以克隆该对象以获得一个新对象。

关于c++ - C++ 类/层次结构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com