gpt4 book ai didi

c++ - 提供虚函数错误

转载 作者:行者123 更新时间:2023-12-03 08:51:43 25 4
gpt4 key购买 nike

考虑从基础结构Triangle继承的两个几何形状LineGeometry。派生的结构继承了虚函数get_area(),因此Triangle通常可以计算面积,但是Line应该给出错误,指示get_area()Line不相关。当显示错误时,我想知道哪个结构称为get_area()和位置(行号),最后终止程序。错误是在编译时还是在运行时显示都没有关系。我该怎么办?

struct Geometry
{
virtual double get_area() = 0;
};

struct Triangle: Geometry
{
double get_area() override {/* some code. */}
};

struct Line: Geometry
{
double get_area() override {/* give error. */}
};

最佳答案

尽管Joachim Pileborg解释了缺陷,但假设您保留当前的设计:

该方法的可能实现是:

double Triangle::get_area() override
{
assert(false);
return 0.;
}

动机:

在 Debug模式下,如果条件为false, assert(condition);将退出程序。假设您拥有IDE和调试器,那么您将能够看到谁调用了该方法。

但是,在常规发行版本中,断言被停用。 return 0.;确保返回有意义的内容。
(注意:这可能会因您使用面积值而改变。NAN可能是一个不错的选择)。

笔记:
  • 因为使用的是虚拟方法,所以该问题必然会在运行时 pop 。这是一种设计异味,可以通过几种方法解决(将线的面积定义为0,创建中介类Shape1D和Shape2D,...)
  • 在C++中,获取调用者(即仅来自代码的调用堆栈)比Java之类的语言困难。获取它是实现定义的,以及获取人类可读的方法名称。但是,处于 Debug模式+拥有调试器(大多数IDE就是这种情况),您可以轻松完成此操作。
  • 关于c++ - 提供虚函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144054/

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