Публичные ли статические функции базового класса становятся функциями-членами производного класса, если базовый класс наследуется публично? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь запустить следующий код, но получаю сообщение об ошибке.

#include <iostream>
template <typename T>
class Base {
  public :
    static T& Get() {
      static T t;
      return t;
    }
};    
class Derived : public Base<Derived> {
  private :
    Derived() {}
    // friend Base<Derived>;  //un-commenting this will make code work.
};                            

int main() {
  Derived& d = Derived::Get();
  return 0;
}

Ошибка:

prog.cpp: В реализации 'static T & Base:: Get () [with T = Derived] ':
prog.cpp: 18: 24: требуется отсюда
prog.cpp: 7: 14: ошибка:' Derived :: Derived () 'является закрытым вэтот контекст
статический T t;
^
prog.cpp: 14: 4: примечание: здесь объявлено закрытым
Derived () {}
^ ~~~~~~

У меня есть следующие вопросы

  1. класс Derived публично получен из класса Base, не делает ли он Get() функцией-членомПроизводные тоже?
  2. Если [1] имеет значение true, и Get() становится функцией-членом Derived, то почему он не может вызвать закрытый конструктор Derived.
  3. Предположим, у нас есть несколько классов, которые должны быть реализованы как Singleton, есть ли способ сделать это, используя шаблоны с чем-то похожим на приведенный выше пример?(дополнительный вопрос)

Я понимаю:

  • Мы можем заставить приведенный выше код работать, сделав базу другом строки производного кода.
  • Мы можем сделать Get() как «нестатическую виртуальную функцию» и переопределить в производных классах.

Я не ищу вышеупомянутые решения.Тем не менее, пожалуйста, дайте мне знать, если это (эти) являются (являются) единственно возможными решениями для достижения такой конструкции.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019
  1. Класс Derived публично является производным от класса Base, не делает ли он Get () функцией-членом Derived?

Нет.Функции-члены (статические и нестатические) базы являются функциями-членами базы, а не функциями-членами производного класса.Однако функции-члены базы (-ов) ищутся при вызове функции-члена (в зависимости от видимости).

0 голосов
/ 06 февраля 2019

класс Derived публично является производным от класса Base, не делает ли он Get () функцией-членом Derived?

Да в том смысле, что поиск Derived::Get() будетработать, но она вызывает ту же функцию, как если бы вы написали Base<Derived>::Get().

Если [1] имеет значение true, и Get () становится функцией-членом Derived, то почему он не можетвызовите приватный конструктор Derived.

Поскольку разные классы не могут получить доступ к закрытым членам по имени.Это то, что является частным.По той же причине, по которой Derived не может получить доступ к закрытым членам Base.

Предположим, у нас есть несколько классов, которые должны быть реализованы как Singleton, есть ли способ сделать это с помощью шаблонов с чем-то похожим наприведенный выше пример?(дополнительный вопрос)

Разве это не то, что делает ваш пример?

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

Правильно.

Мы можем сделать Get () как "не статическая виртуальная функция" и переопределить в производных классах.

Я так не думаю.Вы не можете вызвать эту виртуальную функцию без объекта.Вам потребуется создать экземпляр Derived перед вызовом Get, но Get должен создать наш объект.

Хотя, пожалуйста, дайте мне знать, если это (эти)Это единственное возможное решение для создания такого дизайна. (1039 *

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

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