C ++构造函数,常量,继承和避免重复

时间:2013-11-17 05:04:29

标签: c++ visual-c++ inheritance constants base

所以我已经学习了几个星期的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(){ /* ... */ }
    /* ... */
}

有几点需要注意:

  • 我正在尝试建立一个“工具”的大数据库。
  • 我从不更改'maxAmountCarried'的值,因此我将其设置为const。
  • 内存/性能非常重要,因为我有很多工具。

问题在于我必须继续写作:

ClassName(const float maxCarried):BaseClass(maxCarried){}

这真的很乏味,而且,我担心如果我要添加一个新的const值,我将不得不重复这个过程(当你有50个继承自Food:S的类时出现问题)。

我觉得好像我的设计很糟糕。有没有办法避免一遍又一遍地重复相同的代码行,或者我只是要把它搞砸并处理它?<​​/ p>

提前致谢。

1 个答案:

答案 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

最后,如果性能是一个问题,你可能需要重新考虑你的设计,也许还有别的东西(模板可能?)

希望有所帮助!