gpt4 book ai didi

c++ - 多态性:这种(可能密集的)使用 static_cast 是致命的吗?

转载 作者:太空狗 更新时间:2023-10-29 21:12:52 25 4
gpt4 key购买 nike

上下文如下:模型 有一个(指向)参数 和一个输出ModelParameter 是抽象类。我们使用 Model* 类型的指针来操作 Model 的各种派生(具体)类,其指向 Parameter 的指针动态指向各种派生的实例Parameter 的(具体)类。

这里以类的简化版本为例。我知道 new 应该避免或至少在 delete 之后,但我省略了离题的代码行(例如析构函数)。

// Abstract classes
class Parameter {
public:
virtual void reinitialize() = 0;
};

class Model{
public:
Model(Parameter *argt){ ptr_param = argt; }
virtual void computeModelOutput() = 0;
double output;
Parameter *ptr_param;
};

// Concrete classes
class ACertainKindOfParameter : public Parameter{
public:
ACertainKindOfParameter(int argt){ value = argt; }
virtual void reinitialize(){ value = 1; }
int value;
};

class ACertainKindOfModel : public Model{
public:
ACertainKindOfModel(int argt) : Model(new ACertainKindOfParameter(argt)){}
virtual void computeModelOutput(){
output = 10.0 + (double)(static_cast<ACertainKindOfParameter*>(ptr_param)->value);
}
};

int main(){
ACertainKindOfModel myModel{5};
Model *ptr_model = &myModel;
ptr_model->computeModelOutput();
std::cout << ptr_model->output << std::endl; // 15
}

这段代码中令我困扰的是 ACertainKindOfModel 无法直接访问 value,因此我显然需要使用 static_cast。一个真正的 Model 当然会有一个 vector ,例如50 个 Parameter,不只是一个,所以这意味着每次计算 output(或依赖于参数的任何其他操作)时有 50 个 static_cast .这对我来说不是一个好的做法,但我可能是错的。您看到设计中有什么缺陷吗?

注意:我考虑过将 Parameter 设为类模板,但它似乎不是一个有效的选项,因为 Parameter 的方法在不同类型的value 被考虑。在上面的简单示例中,valueint 类型,但在从 Parameter 派生的另一个类中,它可以是用户定义的类型,例如Color 只有三个可能的值 RGB,以及 reinitialize()value = 1 非常不同。 Parameter 中的虚拟 getter() 会很好,但也行不通,因为重新定义中的返回类型存在冲突。

最佳答案

有几种方法可以使它更清洁。如果 Model 不需要访问 ptr_param,您可以将其从 Model 中删除并将其存储在每个派生类中,并使用正确的类型。

或者您可以将 static_cast 封装在每个模型类中的 getter 函数中:

ACertainKindOfParameter *getParam() const { return static_cast<ACertainKindOfParameter *>(ptr_param); }

您可以结合使用这两种技术。在派生模型类中定义参数,并使用协变返回类型以允许基础 Model 类访问。在 Model 中,声明一个 getter:

virtual Parameter *getParam() const = 0;

然后,在每个模型中,声明一个协变覆盖:

virtual ACertainKindOfParameter *getParam() const override { return ptr_param; }

假设 ptr_param 在 ACertainKindOfModel 中声明。如果不是,则需要如上所述应用 static_cast

或者您可以将 static_cast 的结果保存在 compute 函数中以避免多次使用它。

关于c++ - 多态性:这种(可能密集的)使用 static_cast 是致命的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008194/

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