2016-11-22 3 views
13

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

Book.h:

class Book { 
    ... 
}; 

Library.h:

struct Book; 

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

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

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

+5

Это не ошибка в C++, но VS может дать вам некоторые горе. – juanchopanza

+0

@Danh отредактировал вопрос, чтобы объяснить разницу. –

+0

Аналогичный вопрос: http://stackoverflow.com/questions/4866425/mixing-class-and-struct –

ответ

14

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

Единственное место, где struct необходимо использовать над class, является ли пересылка декларацией непрозрачных данных для привязок.


Что касается вашего редактирования:

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

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

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

+0

Спасибо за ответ. Для спокойствия и избежания любых компиляционных причуд и возможных грядущих будущих психопатических сторонников я сделаю все заявления вперед. –