[英]C++ Constructors, Constants, Inheritance and Avoiding Repetition
所以我已经学习C ++几周了,但是我有点麻烦:
Class Tool
{
public:
Tool(const float maxCarried = 1):maxAmountCarried(maxCarried){}
virtual void Use() = 0;
/* ... */
}
Class CuttingTool: public Tool
{
public:
CuttingTool(const float maxCarried):Tool(maxCarried){}
virtual void Use(){ /* ... */ }
/* ... */
}
Class Saw: public CuttingTool
{
public:
Saw(const float maxCarried):CuttingTool(1){}
virtual void Use(){ /* ... */ }
/* ... */
}
Class Scissors: public Fruit
{
public:
Scissors(const float maxCarried):CuttingTool(2){}
virtual void Use(){ /* ... */ }
/* ... */
}
注意事项:
问题在于我必须继续写:
ClassName(const float maxCarried):BaseClass(maxCarried){}
而且,这真的很乏味,我担心如果我要添加一个新的const值,我将不得不再次重复该过程(当您有50个继承自Food:S的类时会出现问题)。
我觉得我的设计似乎很差。 有没有一种方法可以避免一遍又一遍地重复同一行代码,还是我只需要吸收它并加以处理?
提前致谢。
如果您唯一关心的是重复的初始化列表,则可以使用如下宏:
#define DEFAULT_CONSTRUCTOR(Child, Parent) Child(float max) : Parent(max) {}
并像这样使用它:
class Saw : public CuttingTool
{
public:
DEFAULT_CONSTRUCTOR(Saw, CuttingTool) {}
};
您可以扩展这个想法并执行类似的操作:
#define BEGIN_CLASS(Child, Parent) class Child : public Parent { \
public: \
Child(float max) : Parent(max) {}
#define END_CLASS };
并声明您的课程:
BEGIN_CLASS(Scissors, Tool)
void cut_through_paper() {} // specific method for scissors
END_CLASS
请注意,将const float
用作参数毫无意义,因为无论如何您都无法更改通过值传递的参数。 但是,您可能想使用const float&
通过引用传递参数,如果float的大小大于特定平台中指针的大小,这将是有意义的。
如果您从未更改最大值,则可以将其设为静态并在所有工具实例之间共享:
class Tool
{
protected:
static const float _max;
public:
Tool() {}
};
const float Tool::_max = 0;
如果您只想更改一次最大值(例如在程序开始时,则可以添加一个静态函数:
static void globalMax(float max) { Tool::_max = max; }
并在适当的地方使用它:
int main() {
Tool::globalMax(5);
...
...
}
请注意,您应该从_max
声明中删除const
。
最后,如果性能是一个问题,那么您可能需要重新考虑您的设计,并可能选择其他东西(也许是模板?)
希望有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.