gpt4 book ai didi

c++ - 派生类依赖函数

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

我有基类 DataProcessor。它是某些坐标系中位置计算器的基类。因此,例如,它可以有如下后代:SphericDataProcessorCartesianDataProcessor。有基类CookedDataCatalogue,它是一些对象位置容器的基类。所以每个 DataProcessor 都应该能够将其数据放入每个 CookedDataCatalogue。我可以想象这样的事情:

class CookedDataCatalogue
{
virtual void Transform(DataProcessor* dp) = 0;

virtual void PutData(???) = 0;
}


class CookedDataCatalogue1 : public CookedDataCatalogue
{
void Transform(DataProcessor* dp) override
{
dp->TransformTo(this);
}
}

class CookedDataCatalogue2 : public CookedDataCatalogue
{
...
}

class CookedDataCatalogue3 ...

class DataProcessor
{
virtual void Process() = 0;

virtual void TransformTo(CookedDataCatalogue1* c) = 0;
virtual void TransformTo(CookedDataCatalogue2* c) = 0;
virtual void TransformTo(CookedDataCatalogue3* c) = 0;
}

可是我不喜欢。首先,void Transform(DataProcessor*) 从基类迁移到所有子类**。其次,如果我将其构建为库,则其他用户无法添加他自己的 CookedDataUserCatalogue,因为他无法添加另一个 void TransformTo(CookedDataUserCatalogue)。第三,我不知道如何编写函数PutData(),因为每个目录都使用自己的数据来包含。它应该被模板化吗?

什么是解决方案?是否有任何我错过的编程模式?

最佳答案

有两种方法可以做到这一点以及评论中提到的Double Dispatch Pattern:

基线

首先是指定一组“基线”坐标。为了首先转换到核心集,然后从中转换。

优点:您只需为任意数量的不同DataProcessor 编写toBaselinefromBaseline。添加一个新的 DataProcessor 就像创建它然后将转换写入核心集和从核心集写入转换一样简单。

缺点:在大多数情况下,当您进行两次转换时,性能会受到影响。由于表示或转换方面的损失,准确性可能会受到影响。

变形金刚对象

创建一个接口(interface),将对象从 DataProcessor 转换为 DataProcessor

为每个支持的转换创建该接口(interface)的一个实例。

拥有一个实用程序类,其中包含源和目标对映射到要使用的正确转换。调用该实用程序类的方法以按需执行转换。

优点:不会因为必须进行多次转换而造成浪费。

缺点:需要创建 n^2 个 Transform 对象,其中 n 是不同 DataProcessor 对象的数量。创建新的 DataProcessor 时,您需要为添加的每个 DataProcessor 编写和添加 Transform 对象。缺少 Transform 将在运行时而非编译时检测到。

关于c++ - 派生类依赖函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927213/

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