C ++ Убедитесь, что подклассы предоставляют пользовательское значение для константы - PullRequest
0 голосов
/ 07 октября 2018

Предположим, у нас есть абстрактный class A, который имеет несколько подклассов.Каждый конкретный класс (не объект) имеет связанный с ним приоритет.Одним из способов сохранения этого приоритета является просто protected int prio в A.

Но как вы гарантируете, что каждый подкласс действительно устанавливает значение для prio?

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

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Одним из способов сохранения этого приоритета является просто protected int prio в A.

. Это не сработает.

Если вы используете

static int prio;

У вас будет только одна переменная для A и всех ее подклассов.

Если вы используете

int prio;

, каждый экземпляр будет иметь этокак переменная-член, побеждающая цель создания значения для каждого класса.

Вы можете использовать следующую стратегию для минимизации стандартного кода.

class A { ... };

template <typename T>
struct PriorityHolder
{
   static int prio;
};

template <typename T> 
int PriorityHolder<T>::prio = <Find a suitable method for value>;

class Derived1 : public A,
                 public PriorityHolder<Derived1>
{
    ...
};
0 голосов
/ 07 октября 2018

Я не вижу способа, обеспечивающего инициализацию нестатических элементов данных в подклассах.Поддерживать разные члены статических данных с одинаковым значением тоже сложно и подвержено ошибкам.Поэтому я бы предложил использовать чисто виртуальную функцию, чтобы получить приоритет подклассов на лету.Pure virtual гарантирует, что подклассы должны переопределить этот метод получения:

class Base {
public:
    void print() const { std::cout << "prio: " << getPrio() << std::endl; }
protected:
    virtual int getPrio() const = 0;
};

class Sub1 : public Base {
    int getPrio() const override { return 1; }
};

class Sub2 : public Base {
    int getPrio() const override { return 2; }
};

int main()
{
    Sub1 s1;
    Sub2 s2;
    s1.print();
    s2.print();
    return 0;
}
0 голосов
/ 07 октября 2018

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

class A {
public:
  virtual int get_priority()=0;
};


class B : A {
public:
  int get_priority() {
     return 2;
  }
};

class C : A {
public:
  int get_priority() {
    return 3;
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...