Как я могу заставить компилятор выдавать ошибку для классов, которые определяют тело метода при использовании ключевого слова __interface? - PullRequest
1 голос
/ 05 июля 2011

После прочтения этой статьи: Использование интерфейсов в C ++

Я решил использовать ключевое слово __interface с макросом, который будет добавлять виртуальные деструкторы, как описано в приведенной выше ссылке.

Я был рад, что ключевое слово __interface заставит компилятор применять правила интерфейса, но я был разочарован, когда взял его для тест-драйва ... Оказывается, ключевое слово __interface не применяет правило что метод в интерфейсе не должен содержать тело метода.

Конечно, я могу добавить макрос для методов функций, но я не хочу этого делать. У кого-нибудь есть другие предложения?

РЕДАКТИРОВАТЬ : переносимость не проблема для меня, потому что я должен скомпилировать как для Windows, так и для Linux, поэтому я буду использовать ключевое слово __interface, когда я нахожусь на Windows, а не на Linux, это будет для обеспечения соблюдения приведенных ниже правил , которые не могут быть реализованы через абстрактный базовый класс :

  1. Может наследовать от нуля или более базовых интерфейсов.
  2. Может содержать только публичные, чисто виртуальные методы.
  3. Не может содержать данные членов; свойства разрешены.
  4. Невозможно наследовать от базового класса.
  5. Не может содержать конструкторы, деструкторы или операторы.
  6. Не может содержать статические методы.

Помимо проблемы с деструктором, которая может быть решена, можно увидеть преимущество использования этого ключевого слова в Windows env.

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

В Стандартном C ++ , как в Java, отсутствует ключевое слово интерфейса. То, что у вас есть в C ++, - это абстрактные базовые классы.

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

Пример класса Abstract в качестве интерфейса

class Shape
{
    public:
        virtual void draw()=0;
};

class Rectangle:public Shape
{

    public:
       void draw()
       {
           //draw a Rectangle
       }    
};


int main()
{
    Shape *ptr = new Rectangle();
    ptr->draw();  //calls draw() of Rectangle class

    return 0;
}

Обратите внимание, что:

__interface ключевое слово как новое расширение Microsoft для компилятора C ++.
Это не указано в стандарте C ++ и не является переносимым.

РЕДАКТИРОВАТЬ: Этот ответ был на вопрос "__interface ключевое слово Win c ++ " и был помечен C++.

3 голосов
/ 05 июля 2011

__interface - это расширение Microsoft * . Это не стандартно и не портативно.

Кроме того, C ++ допускает, чтобы чистый virtual метод имел тело функции.

class Base {
  virtual void foo () = 0;
};
void Base::foo ()
{ } // ok

Желательно явно объявить virtual деструктор в теле класса.

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