Создание классов C ++, наследуемых от структур C, рекомендуется? - PullRequest
7 голосов
/ 17 июля 2011

Я недавно делал кодирование Windows Api (все еще делаю это). И я пытался найти лучший способ обернуть WNDCLASSEX в класс C ++, когда у меня появилась эта сумасшедшая идея, WNDCLASSEX - это правильная структура? (хотя он написан на c) и в C ++ структуры обрабатываются как классы, так почему бы мне не объявить мой WinCLass как производную от WNDCLASSEX, поэтому я попытался:

 class WinClass : protected WNDCLASSEX

И это сработало! Затем я попытался использовать его со структурами SDL, но они тоже сработали. Но некоторые структуры (особенно SDL) либо не компилируются, либо вызывают необъяснимые ошибки времени выполнения, когда я извлекаю из них классы. Итак, мой вопрос: Рекомендуется ли использовать этот тип структуры C? Это на самом деле используется профессионалами, или это просто неудачный взлом? Должен ли я использовать для своих оберток или приложений, или это просто приведет к необъяснимым ошибкам?

Ответы [ 3 ]

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

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

Это включает в себя виртуальные деструкторы!

1 голос
/ 17 июля 2011

Единственное различие между классом и структурой в C ++ состоит в том, что Спецификаторы доступа .

Для классов спецификатор доступа по умолчанию является приватным.
Для структур спецификатор доступа является публичным по умолчанию.

Это означает, что если у вас есть класс, производный от другого класса / структуры, по умолчанию это будет частное наследование &
Если у вас есть структура, производная от другого класса / структуры, по умолчанию это будет публичное наследование .

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

РЕДАКТИРОВАТЬ:
Благодаря комментариям у меня есть четкое представление о том, какие ошибки вы имеете в виду, ошибки не являются конкретно, потому что вы производные от структурыно потому что вы неправильно понимаете правила спецификаторов наследования и доступа.

Вот пример программы для демонстрации:

#include<iostream>

using namespace std;

struct FirstStruct
{
    private:
        int a;
    public:
        int b;
        FirstStruct():a(10),b(20),c(30)
        {
        }
    protected:
        int c;
};

class MyClass:protected FirstStruct
{
    public: 
        int i;
        MyClass():i(40),j(50),k(60)
        {
        }
        void doSomething()
        {
            a = 100; //private in Base is not accessible in Derived
            b = 100; //Accessible
            c = 100; //Accessible  

            i = 100; //Accessible  
            b = 100; //Accessible  
            c = 100; //Accessible  
        }
    private:
        int j;
    protected:
        int k; 
};

int main()
{
    MyClass obj;
    obj.i = 100; //Accessible
    obj.j = 100; //Error Cannot be Accessed, j is private member
    obj.k = 100; //Error Cannot be Accessed, k is protected member
    obj.a = 100; //Error Cannot be Accessed, a is private member in Base Class
    obj.b = 100; //Error Cannot be Accessed; 
                 //b is protected member of MyClass, because of protected Inheritance
    obj.c = 100; //Error Cannot be Accessed; 
                 //same reason as b


    obj.doSomething();

    return 0;
}

Вы можете проверить запуск того же здесь в Ideone.
Вы будетеОбратите внимание, даже если вы измените тип базы с struct FirstStruct на class FirstStruct здесь вы получите те же ошибки (не более и не менее).

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

0 голосов
/ 17 июля 2011

У меня нет большого опыта работы с Win API, но я знаю, что в C ++ единственная разница между классами и структурами - это видимость по умолчанию. Для классов это является частным, а для структур - публичным. Другими словами, класс может быть подклассом структуры.

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

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