поэтому я изучаю 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);
...
...
}
Обратите внимание, что вы должны удалить const
от _max
декларация.
Наконец, если производительность является проблемой, вам, вероятно, нужно переосмыслить свой дизайн и, возможно, заняться чем-то другим (возможно, шаблонами?)
Надеюсь, это поможет!
Других решений пока нет …