C++;构造函数、常量、继承和避免重复 所以我已经学习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(){ /* ... */ } /* ... */ }
需要注意的几点:C++;构造函数、常量、继承和避免重复 所以我已经学习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(){ /* ... */ } /* ... */ },c++,visual-c++,inheritance,constants,base,C++,Visual C++,Inheritance,Constants,Base,需要注意的几点: 我正试图建立一个大型的“工具”数据库 我从未更改“MaxAmountCarriered”的值,因此我将其设置为const 内存/性能很重要,因为我有大量的工具 问题在于我必须继续写作: ClassName(const float maxCarried):基类(maxCarried){} 这真的很乏味,而且,我担心如果我要添加一个新的const值,我将不得不再次重复这个过程(当您有50个类继承自Food:s时的问题) 我觉得我的设计很糟糕。有没有一种方法可以避免重复同一行代码
- 我正试图建立一个大型的“工具”数据库李>
- 我从未更改“MaxAmountCarriered”的值,因此我将其设置为const
- 内存/性能很重要,因为我有大量的工具
ClassName(const float maxCarried):基类(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);
...
...
}
请注意,您应该从\u max
声明中删除常量
最后,如果性能是一个问题,您可能需要重新考虑您的设计,并可能使用其他东西(可能是模板?)
希望这有帮助!你真的需要从食物类继承100个类吗?食物
有一个属性告诉我们它是什么类型的食物不是更有意义吗?西瓜
对象有哪些属性是西番莲
对象没有的?该死,你让我饿了。Nhgrif,a这只是一个类比/示例代码,以明确问题所在。每个类都有一个完全使用相同函数但函数本身完全不同的类。我想我应该将这些类改为“工具”主题。如果你拥有启用C++11的编译,我也会感到饿r、 您将能够编写类裁剪工具:公共工具{using Tool::Tool;};
阅读Wow!这非常有用!我将更好地了解#define(目前仅用于定义全局常量)在此之后,我肯定会在将来使用它。非常感谢!我还会研究模板和静态常量,再次感谢!