в C ++ я могу получить класс из структуры - PullRequest
25 голосов
/ 23 февраля 2009

Вопрос говорит обо всем на самом деле. Могу ли я получить класс из структуры или мне следует создать класс, который встраивает мою структуру и определяет конструкторы копирования и оператор = для перемещения между ними?

Ответы [ 3 ]

34 голосов
/ 23 февраля 2009

В C ++ struct (почти) является синонимом class (за исключением другого уровня доступа по умолчанию), так что да, вы можете.

struct A {
// fields are public by default
};

class B: public A {
// fields are private by default
};

Я не знаком с MFC, но похоже, что это попытка поддерживать API C и C ++.

9 голосов
/ 23 февраля 2009

Конечно, ты. Отличие наследования в том, что если вы определите класс, он будет наследовать private от других классов / структур. Если вы определяете структуру и наследуете ее от класса или структуры, по умолчанию это будет публичное наследование:

// the following two are equivalent except that one time class is 
// used and the other time struct
struct f : g { };
class f : public g { };

Если вам интересно, как вы должны обернуть структуры C - я бы включил их в класс в качестве члена. Поскольку структуры C не были предназначены для наследования (подумайте ни о защищенном, ни о виртуальном деструкторе в структурах C - они не могут иметь такой объект). Это простые агрегаты, которые собирают данные. И размещение их в качестве членов использует их как таковые (например, в «точке есть пара координат x и y»).

C-структуры также выставляют членов, которые, возможно, не должны быть выставлены в классе. Сдерживание позволяет точно контролировать то, что раскрывается, а что нет, с помощью функций get / set, и вы все равно можете позволить ему дать вам копию или ссылку на содержащийся голый объект структуры C.

7 голосов
/ 23 февраля 2009

Да. Вы можете получить класс из структуры. В C ++ структура - это просто класс, в котором доступ по умолчанию является открытым, а не закрытым. Извлечение класса из структуры, которая добавляет только невирусные функции-члены и / или статические функции, является полезным методом для обеспечения интерфейса C ++, поддерживая совместимость с API-интерфейсом в стиле C.

Это именно тот подход, который используется MFC для многих структур C (вопреки тому, что вы указали в своем вопросе).

Например, класс CRect является публично производным от struct tagRECT (более часто используемое имя RECT - это typededf для struct tagRECT). Поскольку struct tagRECT определяет все элементы данных, а CRect добавляет только не виртуальные функции-члены, структура памяти CRects и RECT одинакова - вы можете использовать CRect в качестве аргумента для любой функции, ожидающей RECT, и наоборот.

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