Visual 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(){ /* ... */ }
/* ... */
}

Несколько вещей, на которые стоит обратить внимание:

  • Я пытаюсь сделать большую базу данных «Инструменты».
  • Я никогда не изменяю значение maxAmountCarried, поэтому я установил его как const.
  • Память / производительность важна, потому что у меня огромный вектор инструментов.

Проблема заключается в том, что я должен продолжать писать:

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

Это действительно утомительно, более того, я беспокоюсь о том, что если бы я добавил новое значение const, мне пришлось бы повторять этот процесс снова (проблема, когда у вас есть 50 классов, унаследованных от Food: S).

Я чувствую, как будто я разработал это плохо. Есть ли способ избежать повторения одной и той же строки кода снова и снова, или мне просто нужно смириться с этим и разобраться с этим?

Заранее спасибо.

0

Решение

Если ваша единственная задача — повторяющийся список инициализации, вы можете использовать такой макрос:

#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 декларация.

Наконец, если производительность является проблемой, вам, вероятно, нужно переосмыслить свой дизайн и, возможно, заняться чем-то другим (возможно, шаблонами?)

Надеюсь, это поможет!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector