Pytanie to wszystko naprawdę. Czy mogę wyprowadzić klasę ze struktury, czy też powinienem stworzyć klasę, która osadza moją strukturę i definiuje konstruktorów kopii oraz operator =, aby poruszać się między tymi dwoma?w C++, czy mogę wyprowadzić klasę z struct
Odpowiedz
W języku C++ struct
jest (prawie) równoznaczne z class
(z wyjątkiem innego domyślnego poziomu dostępu), więc tak, można.
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
Nie jestem zaznajomiony z MFC, ale wygląda na to, że próbuję zachować API C i C++.
Dzięki za to. Byłem prawie pewien, że było dobrze, ale nigdy nie widziałem tego w praktyce. –
Oczywiście, że tak. Różnica w dziedziczeniu polega na tym, że jeśli zdefiniujesz klasę, odziedziczy ona prywatne z innych klas/struktur. Jeśli definiować struct i wyprowadzić go z klasy lub struktury, będzie to dziedziczenie publiczne domyślnie:
// the following two are equivalent except that one time class is
// used and the other time struct
struct f : g { };
class f : public g { };
Jeśli zastanawiasz się, jak należy owinąć struktur C - chciałbym umieścić je jako członka do klasy . Ponieważ struktury C nie zostały zaprojektowane do odziedziczenia (nie są to ani chronione, ani wirtualne destruktory w C-strukturach - nie mogą mieć jednego). Są to proste agregaty zbierające dane. I umieszczenie ich jako członków używa ich jako takich (jak w "punkcie ma parę współrzędnych xi y").
Struktury C także narażają członków, których być może nie powinno się ujawniać w klasie. Przechowywanie umożliwia precyzyjną kontrolę nad tym, co jest wyeksponowane, a co nie przez funkcje get/set, i nadal możesz dać mu kopię lub odwołanie do zawartego nagiego obiektu C struct.
Tak. możesz wyprowadzić klasę ze struktury. W C++, struct jest po prostu klasą, w której domyślny dostęp jest publiczny, a nie prywatny. Wyprowadzenie klasy ze struktury, która dodaje tylko niepowiązane funkcje członkowskie i/lub funkcje statyczne, jest przydatną techniką zapewnienia interfejsu C++ przy jednoczesnym zachowaniu zgodności z interfejsem API w stylu C.
To jest właśnie podejście stosowane przez MFC dla wielu struktur C (w przeciwieństwie do tego, co podajesz w swoim pytaniu).
Na przykład klasa CRect jest publicznie wyprowadzana z struct tagRECT (najczęściej używaną nazwą RECT jest typeded dla struct tagRECT). Ponieważ struct tagRECT definiuje wszystkie elementy danych, a CRect dodaje tylko nie-wirtualne funkcje składowe, układ pamięci CRect i RECT są identyczne - możesz użyć CRect jako argumentu dla dowolnej funkcji oczekiwanej RECT i na odwrót.
- 1. C++ Klasa lub Struct kompatybilność z C struct
- 2. Jak można wyprowadzić klasę z szablonu specjalizującego się w sobie?
- 3. Czy można wyprowadzić z System.ArgumentException?
- 4. Jak mogę wyprowadzić wartość klasy wyliczeniowej w C++ 11
- 5. Jak mogę wyprowadzić UTF-8 z Perla?
- 6. W Haskell, jak automatycznie wyprowadzić taką niestandardową klasę?
- 7. jest różnica między struct w C++ i struct w C#?
- 8. Czy mogę uzyskać dostęp do elementu struct/class z szablonu?
- 9. Struct marszałek w C#
- 10. Struct Constructor w C++?
- 11. Jak mogę wyprowadzić wiodące zera w Ruby?
- 12. struct wyrównanie C/C++
- 13. Czy mogę przedłużyć ostatnią klasę w Swift?
- 14. Jak poprawnie zainicjować C struct z C++?
- 15. wyprowadzić typ elementów tuple w C++ 11
- 16. C++ struct tm & time_t
- 17. Czy mogę zaimportować plik CSV i automatycznie wyprowadzić separator?
- 18. C tablice struct
- 19. Dziedziczenie C++ Struct w Cython
- 20. Cryptic definicja struct w C
- 21. bezpośrednie inicjalizacji struct w C
- 22. Błąd magistrali w C struct
- 23. marszałka C++ tablicy struct w C#
- 24. C++ initialize anonimowy struct
- 25. Definiowanie naprzód deklarowaną C-struct jak C++ - struct
- 26. Czy mogę "rozszerzyć" strukturę w C?
- 27. Jak używać C struct z tablicy 2D w C# Jedności
- 28. Jak mogę opakować klasę C++ w rozszerzenie php?
- 29. Struct C# Generic Konstruktor
- 30. Struct X w Struct X?
Klasy MFC klasy CRect dziedziczą po struct tagRECT, AFAICS. – Constantin
Mój zły - tekst pytania się zmienił. –