Подтвердить что ты не робот

Форвардное объявление как struct vs class

Я обнаружил ошибку в объявлении класса С++, которое было неправильно объявлено как struct Book вместо class Book. Я думаю, что книга раньше была структурой, была изменена на класс, но декларации вперед остались.

Book.h:

class Book {
    ...
};

Library.h:

struct Book;

class Library {
    std::vector<Book*> books;
};

Не было никаких предупреждений компилятора, и в результате программа, похоже, работала нормально. Мне было любопытно: в теории, может ли это когда-либо вызвать проблему? Это просто указатель, да, но, например, если у класса были виртуальные методы, множественное наследование, могут ли указатели отличаться?

Я знаю различия между классом/структурой в отношении public/private по умолчанию, но я спрашиваю конкретно о передовых декларациях и возможных последствиях их замены.

4b9b3361

Ответ 1

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

Единственное место, где struct должно использоваться над class, - это когда forward объявляет непрозрачные данные для c привязки.


Относительно вашего редактирования:

Я знаю различия между классом/структурой в отношении public/private по умолчанию, но я спрашиваю конкретно о передовых декларациях и возможных последствиях их замены.

Visual С++ выдает предупреждение C4099. Он делает это, потому что украшение имени для его функций включает ключевое слово, которое вы использовали. Таким образом, программы могут неправильно соединить. Таким образом, совершенно стандартный совместимый код не может ссылаться при использовании VС++ (перемещение кости в части Microsoft, AFAIC).

Обсуждение этого предупреждения, а также почему его можно игнорировать, если вас дисциплинируют, можно найти здесь