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