所以我已经学习了几个星期的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的类时出现问题)。
我觉得好像我的设计很糟糕。有没有办法避免一遍又一遍地重复相同的代码行,或者我只是要把它搞砸并处理它?</ p>
提前致谢。
答案 0 :(得分:1)
如果你唯一关心的是重复初始化列表,你可以使用这样的宏:
#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);
...
...
}
请注意,您应从const
声明中删除_max
。
最后,如果性能是一个问题,你可能需要重新考虑你的设计,也许还有别的东西(模板可能?)
希望有所帮助!