Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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(目前仅用于定义全局常量)在此之后,我肯定会在将来使用它。非常感谢!我还会研究模板和静态常量,再次感谢!