Lost_Universe
@Lost_Universe
Студент

Как организовать статическую реализацию интерфейса?

Как создать статический класс наследуемый от интерфейса с чисто виртульными функциями?
Собственно есть интерфейс класса функций(В файлике "Student_Interface.h"):
class Function_Interface {
    virtual StudentInterface* Initialize(std::string) = 0;
    virtual int mostViolencedRoom(StudentInterface*) = 0;
    virtual int lateSettlement(StudentInterface*, std::string) = 0;
    virtual int StudentViolence(StudentInterface*, std::string) = 0;
};

И есть попытка его реализации ("Student_Interface.cpp"):
class Function : Function_Interface {
public:
    static int mostViolencedRoom(Student* list) {
        //code
    }
    static int lateSettlement(Student* list, std::string date) {
        //code
    }
    static int StudentViolence(Student* list, std::string name) {
        //code
    }
};

При попытке скомпилировать это чудо Visual Studio Code зависает а билд g++ из консоли сначала выдавал что то вроде:
[...] In file "Student_Interface.h", in function "virtual int mostViolencedRoom(StudentInterface*) = 0" cannot be declared
[...] In file "Student_Interface.cpp", since "static int mostViolencedRoom(StudentInterface* list)" was declared.

Потом и вовсе начал выдавать строчки без ошибок но с неизвестными файлами (насколько полагаю это были файлы линковки).
Проверял код на Microsoft Visual Studio ситуация аналогична g++.
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
@rPman
Использование виритуальных методов идеологически подразумевают наличие экземпляра объекта, тип которого по исходникам не известен и используется базовый тип предка, но прописан в таблице виртуальных методов (ссылка на которую будет таскать каждый экземпляр объекта). Да, было бы классно иметь доступ к этой таблице методов синтаксически но такова селяви.

Поэтому в с++ нельзя быть одновременно virtual и static (а у тебя тебя еще веселее, предок не статичный а потомка ты пытаешься сделать статичным)

Обходят это созданием промежуточных методов и даже класса, где методы не статичные но для них создается фиктивный пустой объект (для него можно написать отдельную пустую инициализацию) в котором собраны все виртуальные методы. Сам этот объект в классе уже определен static.

Лично я считаю это достаточно неудобным чтобы вообще оставить static в принципе, лучше без него тогда
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы