在 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
类位于客户端代码中,我无法控制。