В этом вопросе говорится все. Могу ли я получить класс из структуры, или я должен создать класс, который внедряет мою структуру и определяет конструкторы копирования и оператор =, чтобы перемещаться между ними?
В С++ я могу получить класс из структуры
Ответ 1
В С++ struct
(почти) синонимом class
(за исключением другого уровня доступа по умолчанию), так что да, вы можете.
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
Я не знаком с MFC, но это похоже на попытку поддерживать как C, так и С++ API.
Ответ 2
Конечно. Другое отличие в отношении наследования заключается в том, что если вы определяете класс, он наследует частный из других классов/структур. Если вы определяете структуру и выводите ее из класса или структуры, по умолчанию это будет публичное наследование:
// 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 structs - я бы вставлял их как член в класс. Поскольку структуры C не были унаследованы (подумайте о не защищенном и виртуальном деструкторе в C-структурах, они не могут быть такими). Это простые агрегаты, которые собирают данные. И, помещая их как члены, использует их как таковые (как в "точке есть пара х и y-координата" ).
C structs также выставляют членов, которые, возможно, не должны отображаться в классе. Containment позволяет точно контролировать то, что открыто, а что нет, с помощью функций get/set, и вы все равно можете дать ему копию или ссылку на содержащийся открытый объект структуры C.
Ответ 3
Да. вы можете получить класс из структуры. В С++ структура - это просто класс, где доступ по умолчанию является открытым, а не частным. Получение класса из структуры, которая добавляет не-виртуальные функции-члены и/или статические функции, является полезным методом для обеспечения интерфейса С++, поддерживая совместимость с API-интерфейсом C.
Это точно подход, используемый MFC для многих структур C (вопреки тому, что вы заявляете в своем вопросе).
Например, класс CRect публично выводится из struct tagRECT (наиболее часто используемым именем RECT является typededf для struct tagRECT). Поскольку struct tagRECT определяет все члены данных, а CRect добавляет только не виртуальные функции-члены, макет памяти CRects и RECT идентичен - вы можете использовать CRect в качестве аргумента для любой функции, ожидаемой RECT и наоборот.