2016-11-22 15 views
13

Znalazłem błąd w deklaracji forward C++ klasy, która została błędnie zadeklarowana jako struct Book zamiast class Book. Myślę, że Book był strukturą, został zmieniony na klasę, ale deklaracje dotyczące przyszłości pozostały.Deklaracja przekazywania jako struktura kontra klasa

Book.h:

class Book { 
    ... 
}; 

Library.h:

struct Book; 

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

Nie było żadnych ostrzeżeń kompilatora i wynikający Program wydawał się działać prawidłowo. Zastanawiało mnie to: w teorii, czy może to kiedykolwiek spowodować problem? To tylko wskaźnik, tak, ale na przykład, jeśli klasa miała wirtualne metody, wielokrotne dziedziczenie, czy wskaźniki mogły być inne?

Znam różnice między klasą/strukturą dotyczące domyślnych publicznych/prywatnych, ale ja pytam konkretnie o deklaracje terminowe i możliwe konsekwencje ich zamiany.

+5

To nie jest błąd w C++, ale VS może dać ci trochę żal. – juanchopanza

+0

@Danh edytowane pytanie, aby wyjaśnić różnicę. –

+0

Podobne pytanie: http://stackoverflow.com/questions/4866425/mixing-class-and-struct –

Odpowiedz

14

i class są całkowicie wymienne w odniesieniu do zgłoszeń do przodu. Nawet w przypadku definicji mają one wpływ tylko na domyślny specyfikator dostępu do elementów obiektów, wszystko inne jest równoważne. Zawsze definiujesz "klasy" obiektów.

Jedynym miejscem, w którym musi być używany ponad class, jest data przekazania nieprzejrzystych danych dla powiązań .


Odnośnie swojej EDIT:

Znam różnice między klasy/struct dotyczące domyślny publiczny/prywatny, ale pytam konkretnie o terminowe deklaracji i ewentualne konsekwencje ich zamianę.

Program Visual C++ generuje ostrzeżenie C4099. Robi to, ponieważ dekoracja nazwy zawiera funkcje użyte w słowie kluczowym. W związku z tym programy mogą nie być poprawnie łączone z. Tak więc doskonale standardowy kod zgodny nie może łączyć się przy użyciu VC++ (ruch kostka po stronie Microsoftu, AFAIC).

Omówienie tego ostrzeżenia, a także dlatego może być ignorowana, jeśli są zdyscyplinowani, można znaleźć here

+0

Dzięki za odpowiedź. Dla spokoju ducha i unikania dziwactw kompilatora i możliwych przyszłych gniewów opiekunów psychopatycznych, sprawię, że wszystkie deklaracje terminowe będą zgodne. –

Powiązane problemy