2016-08-05 4 views
-2

У меня есть куча различных подклассов одного класса под названием стратегии, каждый из которых имеет уникальный строковый идентификаторПолучить конкретную строку, основанную на подкласса

class AdaptiveStrategy : Strategy { 
    public: 
      const static std::string uniqueKey; 

      AdaptiveStrategy(); 
    private: 
      ... 
} 

Каждый из них в файле .cpp имеет уникальный идентификатор на основе по его названию. У меня также есть другой файл .cpp, управляющий этими стратегиями. Этот класс Selector имеет указатель на Стратегию, который может меняться в течение всего моего проекта.

class Selector { 
    public: 
     Selector() 
     std::string getStrategyName() // help! 

    private: 
     Strategy *currentStrategy // can be any of the viable Strategy subclasses 
} 

По существу этот указатель неоднократно заменен, чтобы указать на новые стратегии, основанные на кучу разных вещей, которые могут произойти.

Я бы хотел, чтобы в этом Селекторе появился способ вернуть уникальный идентификатор текущей активной стратегии - что было бы лучшим способом сделать это?

ответ

1

Как правило, это делается путем объявления чистого виртуального метода в базовом классе (предположим, что имя метода является «toString»). Затем все производные классы должны реализовать метод toString.

Другой способ сделать это - сохранить имя в базовом классе. Поэтому вы должны перегрузить конструктор и передать имя производного класса родительскому конструктору.

class AdaptiveStrategy : Strategy { 
... 
    AdaptiveStrategy() : Strategy("AdaptiveStrategy") { } 
... 
}; 
+0

Спасибо, Крис. Я знал о первой стратегии, но не был уверен, что это лучший способ заниматься делами. Есть ли какая-либо польза для второго решения, которое вы представили? –

+0

Что касается производительности, второе решение должно быть быстрее, потому что программе не нужно находить правильный виртуальный метод во время выполнения. – Chris