确保派生类构造函数必须调用特定基类方法

2024-02-27

在 C++(03) 类中,我有一个成员变量,它must在对象构造期间被赋值。但是,只有派生类可以计算所需的值。正如这篇文章中所讨论的C++ 是否要求从派生类初始化基类成员? https://stackoverflow.com/questions/12169194/does-c-require-you-to-initialize-base-class-members-from-its-derived-class,我明白派生类不能初始化基类成员,但分配对我来说就足够了。

因此,我在基类中提供了一个方法来分配值,但我无法弄清楚如何强制派生类调用它。下面的示例代码说明了这一点。

class Base {
public:
    Base() {}
    setFoo(unsigned inFoo) { foo = inFoo; }
private:
    unsigned foo;
};

class Derived : public Base {
    Derived() : Base() { 
        unsigned desired = ... // do calculations to get the desired value
        setFoo(desired);  // --> how to ensure that derived class calls this?
    }
};

The foo然后由其他几个基类方法使用。即使我在其中设置了“标志”setFoo(),没有我可以检查它的“构造函数后”方法。基类中还有其他几个方法,其中foo用来。我could在那里检查一下,但这样做太繁琐、容易出错、效率低下。

如果之前有人问过这个问题,我深表歉意。在通过搜索“确保派生类构造函数必须调用特定基类方法”和“强制派生类分配基类成员”进行询问之前,我确实尝试在这里找到它。我发现了一些有用的帖子如何在 C++ 的派生类构造函数中初始化基类的 const 变量? https://stackoverflow.com/questions/3904759/how-can-i-initialize-a-const-variable-of-a-base-class-in-a-derived-class-constr and 强制派生类使用基类的构造函数 https://stackoverflow.com/questions/12783643/force-a-derived-class-to-use-the-constructor-of-the-base-cass,但不幸的是他们没有解决我的问题。

您能否建议我一个合适的方法来解决这种情况?编译时检查解决方案是可取的,但如果不可能,运行时检查也会有所帮助。虽然我无法使用 C++11 来解决我的问题,但我也很高兴学习任何 C++11 解决方案。感谢您的考虑。

Edit当然,将其记录为要求也是一种选择,但我想了解是否有编程解决方案。

Edit2我同意答案说该值应该在构造函数参数中传递,如果我必须写Base从头开始,我不会要求这种方法。问题在于,由于遗留原因,Base已经有几个构造函数参数 (9),我希望通过将它们“卸载”到构造函数主体来避免添加更多参数 (3)。但从长远来看,代码必须重构。

Edit3抱歉进行了如此多的编辑。我can修改Base我喜欢上课,但是Derived类位于客户端代码中,我无法控制。


如果派生类的构造函数必须调用setFoo(),那么我认为这是一个设计问题。最好设计基类,使其构造函数将所需的值作为参数,并让派生类将计算值传递为:

class Base {
public:
    Base(unsigned int foo) : m_foo (foo) {}  //define this constructor
private:
    unsigned int m_foo; //member data
};

class Derived : public Base {
    Derived() : Base(computeValue()) 
    { 
    }
private:
    static unsigned int computeValue() //it may take argument(s)
    {
        unsigned int desired = ... //do calculations to get the desired value
        return desired;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确保派生类构造函数必须调用特定基类方法 的相关文章

随机推荐

  • 如何自定义App Designer人物的背景?

    我想附加徽标或更改应用程序设计器的整个背景uifigure 如何才能做到这一点 如果你想设置一个整个图的纯色背景色 那里存在有记录的方式 https www mathworks com help matlab ref uifigureapp
  • 验证在部分视图中不起作用

    我有一个索引页面 其中有两个部分视图 登录和注册 我正在使用数据模型验证 登录 cshtml model Project ViewModel UserModel div using Html BeginForm Login account
  • 从 Ada 访问 c 常量

    我有一个带有这样类型定义的头文件 ifndef SETSIZE define SETSIZE 32 endif typedef struct set unsigned array SETSIZE set t 要使用相应的 C 函数 我需要在
  • jquery 获取之前输入的文本

    我有以下 html div class active string div
  • 将大文件作为流发送到 process.getOutputStream

    我在 Windows 机器中使用 gzip 实用程序 我压缩了一个文件并作为 blob 存储在数据库中 当我想使用 gzip 实用程序解压缩此文件时 我将此字节流写入 process getOutputStream 但超过30KB后 就无法
  • Android 绘制点

    如何用画布绘制完整的圆或点 我使用画布和路径 绘画类 my code Override public boolean onTouchEvent MotionEvent event float eventX event getX float
  • 如何向谷歌图表中的图例添加工具提示

    使用最新版本的 Google Charts API 我有一个简单的条形图 我想在将鼠标悬停在图例中的元素上时显示一个工具提示 解释图例中的每个项目是什么 我仍然希望栏上的工具提示保持不变并显示其标签和值
  • 使用 GSM 调制解调器接收短信

    我读到 GSM 调制解调器每分钟最多只能接收 30 条短信 如果您需要收到更多 您会怎么做 还有其他技术吗 我认为您可能想要与列出的答案不同的东西构建短信服务器的最佳实践是什么 https stackoverflow com questio
  • 多态关联

    如果您具有多态belongs to关联 那么引用将添加所需的两列 create table products do t t references attachment polymorphic gt default gt Photo end
  • 我应该为范围最小查询使用什么使用 O(n) 存储和 O(log n) 查询时间的数据结构?

    我被算法课的以下作业问题难住了 Suppose that we are given a sequence of n values x1 x2 xn and seek to quickly answer repeated queries of
  • 鲍尔畸形

    我正在学习如何使用 Bower 为了开始 我创建了一个基本的 Bower json 文件 其职责是获取 jquery 我的 Bower json 文件如下所示 name MyProject version 0 0 1 devDependen
  • python 中的私有公共受保护访问说明符

    我们可以在Python中模拟私有和受保护的访问说明符吗 名称修改 eg var 10 可以模拟私有 但可以通过对象轻松地从外部访问 object className var 那么有没有一种方法可以模拟 或者 python 是否直接是我不知道
  • C#中使用ffmpeg提取帧时帧率慢且资源占用高

    我目前正在开发一个项目 需要在 C 中使用 ffmpeg 从视频中提取帧 但是 我面临帧速率慢和资源使用率高的问题 我使用的代码如下 private bool move false private int master frame 0 pr
  • C 流:直接将数据从一个流复制到另一个流,不使用缓冲区

    我想将数据从一个流复制到另一个流 现在通常情况下 我会这样做 n fread buffer 1 bufsize fin fwrite buffer 1 n fout 有没有办法直接写入数据fin to fout 不经过缓冲区 即代替fin
  • 删除 XDocument 中的所有评论

    我正在阅读 XDocument 如何从 XDocument 中删除所有注释行 我尝试过 doc DescendantNodes Where x gt x NodeType XmlNodeType Comment Remove 但这仅删除带有
  • ASP.NET MVC 3:需要部署哪些 dll?

    在未安装 ASP NET MVC 3 的服务器上部署 ASP NET MVC 3 应用程序时 哪些文件需要将 复制本地 标记为 True From http www hanselman com blog BINDeployingASPNET
  • 使用 iTextSharp 将块的一部分右对齐

    我是 iTextSharp 新手 我正在尝试创建 PDF 只是一个简单的例子 如果我做这样的事情 Paragraph p new Paragraph p Add new Chunk 789456 Test f5 newDocument Ad
  • 无法使用 MSSQL 在 PDO 中引用表名

    我必须使用某人的数据库来开发游戏 遗憾的是该游戏有一个名为 User 或 dbo User 的表 并且无法重命名 现在 我需要在 PHP 中使用 PDO 访问它 并且当我使用此查询时 query SELECT UserId AS INTUS
  • 在 C++ 文件 CDT 中包含 Python.h

    如果这是一个愚蠢的问题 我深表歉意 但我尝试用谷歌搜索这个 但找不到任何可以指引我正确方向的东西 我只是想了解我需要做什么来 设置 cdt 以 理解 我的 python h 包含内容 错误的说法是这样的 include
  • 确保派生类构造函数必须调用特定基类方法

    在 C 03 类中 我有一个成员变量 它must在对象构造期间被赋值 但是 只有派生类可以计算所需的值 正如这篇文章中所讨论的C 是否要求从派生类初始化基类成员 https stackoverflow com questions 12169