C++ - pytania dotyczące plików nagłówkowych i źródłowych; kompilacji

0

Hej, mam małe pytania dotyczące podstaw C++

  1. Mam interfejs, no znaczy klasę abstrakcyjną, po której dziewiczy kilka innych klas. Zawiera ona tylko 3 zmienne i jedną funkcję czysto wirtualną. IDE mi wygenerowało dla niej plik .cpp, który jest oczywiście pusty. Powinienem go usunąć czy zostawić?

  2. Jest jakaś kolejność, wg. której są kompilowane pliki?

  3. Jeśli dobrze rozumiem: jeśli w jakiejś klasie (powiedzmy Abc), typ zdefiniowany przez nas (powiedzmy klasa Xyz) występuje tylko jako parametr funkcji albo składowa-wskaźnik, to nie trzeba inludować w pliku nagłówkowym tej klasy, pliku Xyz.h, tylko wystarczy napisać class Xyz; przed kodem klasy, natomiast plik Xyz.h załączamy w pliku z kodem źródłowym? Z kolei gdy typ Xyz jest składową, albo nasza klasa Abc dziedziczy po Xyz, to trzeba go includować już w pliku nagłówkowym?
    Jest jakaś różnica jak będę wszystko załączał w plikach nagłówkowych?

  4. Kontynuacja trzeciego -> Czemu czasem dla niektórych klas (jak dobrze kojarzę - tych co dziedziczą po czymś) często w ogóle nie muszę już nic includować, bo wszystkie moje klasy (i ich funkcje) są już jakby "znane". Z kolei dla innych, jak nie zrobię forward declaration to wywala nieznany typ. O co chodzi?

  5. Jak mam w projekcie w kilku plikach nagłówkowych coś takiego:

// Nazwy plików powymyślane na szybko, tych "includów" jest z 15
#include "Abc.h"
#include "Xyz.h"
#include "Foo.h"
#include "Bar.h"
#include "Def.h"
#include "Spqr.h"
#include "Zyx.h"
#include "Dfg.h"

To da się to jakoś uprościć?


Może głupie pytania, ale przeczytałem poradnik od jakiegoś gości w Internecie, co trochę chaotycznie opisywał i teraz nie rozumiem.

1
  1. Jeśli twój projekt korzysta z PCH to najlepiej zostaw taki plik i w nim miej zaincludeowany PCH i .h. W Visual Studio jeśli nie masz pliku .cpp to Intellisense wariuje i źle koloruje składnie (tak jakby PCH nie widział).

  2. Nie powinieneś zakładać jakiekolwiek kolejności kompilowania plików. Po pierwsze: nie ma to znaczenia. Po drugie: pliki mogą być kompilowane równolegle.

  3. Dokładnie tak. W wielu przypadkach forward declaration wystarczy. Jeśli będziesz wszystko załączał wszędzie to możesz dojść od problemu gdzie nagłowek A includuje nagłówek B, a nagłowek B includuje nagłówek A. Wtedy często masz dziwne błędy kompilacji i szybko dojdziesz do wniosku, że forward declaration to jest jednak lepszy pomysł. Poza tym, jeśli masz include'a to kompilator musi ten plik wczytać z dysku, skompilować go, a to zajmuje czas. Przy dużych projektach drzewo includeów przy kompilowaniu jednej jednostki translacyjnej bywa bardzo rozległe i przez to kod może się kompilować bardzo długo (dłużej niż z forward declaration).

  4. Jeśli includujesz wszystko wszędzie to właśnie dlatego wiele deklaracji już jest znane. Patrz punkt wyżej.

  5. To zależy. Możesz użyć pluginu do Visual Studio "Include-What-You-Use" (https://marketplace.visualstudio.com/items?itemName=Wumpf.IncludeToolbox). Być może kilka z tych includeów możesz po prostu usunąć i kod się będzie kompilował. Albo np. jeśli to jest header często używany ale dany include jest potrzebny tylko w kilku jednostkach translacyjnych to może lepiej tam przenieść to zawarcie? Możliwe też, że include możesz zamienić na forward declaration danej klasy i też kod się będzie kompilował.

1

Co do pustego pliku cpp - prawie zawsze chcesz mieć tam domyślną (nawet pustą) definicję destruktora wirtualnego Twojego interfejsu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1