在 C++(03) 类中,我有一个成员变量,必须在对象构造期间为其赋值。但是,只有派生类可以计算所需的值。正如这篇文章中所讨论的,C++ 是否要求您从其派生类初始化基类成员?,我知道派生类不能初始化基类成员,但是赋值对我来说就足够了。
因此,我在基类中提供了一个方法来分配一个值,但我不知道如何强制派生类调用它。下面的示例代码说明了这一点。
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?
}
};
然后foo
由其他几个基类方法使用。即使我在 中设置了“标志” setFoo()
,也没有可以检查它的“后构造函数”方法。在使用的基类中还有其他几种方法foo
。我可以在那里检查它,但这样做太乏味、容易出错且效率低下。
如果以前有人问过这个问题,我深表歉意。在通过搜索“确保派生类构造函数必须调用特定的基类方法”和“强制派生类分配基类成员”来询问之前,我确实尝试在这里找到它。我遇到了一些有用的帖子如何在 C++ 中的派生类的构造函数中初始化基类的 const 变量?并强制派生类使用基类的构造函数,但不幸的是他们没有解决我的问题。
您能否建议我一种合适的方法来解决这种情况?编译时检查解决方案是可取的,但如果不可能,运行时检查也会有所帮助。虽然我不能使用 C++11 来解决我的问题,但我也很乐意学习任何 C++11 解决方案。感谢您的考虑。
编辑当然,将其记录为要求也是一种选择,但我想了解是否有程序化解决方案。
Edit2我同意应该在构造函数参数中传递值的答案,如果我必须Base
从头开始编写,我不会要求这种方法。问题是由于遗留原因,Base
已经有几个构造函数参数(9),我希望通过将它们“卸载”到构造函数主体来避免添加更多参数(3)。但从长远来看,必须重构代码。
Edit3对这么多的编辑感到抱歉。我可以随意修改Base
课程,但Derived
课程在客户端代码中,我无法控制。