• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ - łączenie plików .h i cpp., problematyczna klasa

0 głosów
3,550 wizyt
pytanie zadane 18 czerwca 2017 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
edycja 18 czerwca 2017 przez Maciek123233

Witam, ostatnio mam bardzo duży problem z łączeniem plików .h i .cpp, ale od początku.

Kiedyś, kiedy robiłem małe projekty w C++ (w code::blocks) na kilka plików .cpp tworzyłem jeden plik .h i tam zapisywałem wszystkie deklaracje funkcji które miały działać między plikami .cpp, wyglądało to mniej więcej tak.

Np. w pliku plik1.cpp zapisywałem wywołanie funkcji, w pliku spis.h deklaracje a np. w pliku plik2.cpp ciało funkcji. Jak była jakaś klasa która miała być widoczna dla wszystkich funkcji, po prostu zapisywałem ją w pliku spis.h.

I tak w pliku spis.h było coraz więcej i więcej deklaracji funkcji i klas, w końcu nie dało się połapać jaka funkcja jest do czego i gdzie co idzie, po prostu był jeden wielki śmietnik. Zrozumiałem że trzeba zrobić więcej plików .h no i tu jest problem bo nie wiem jak to połączyć.

Z początku wszystko połączyłem tak, że np. jakąś klasę zapisywałem w pliku KLASA.h i jeśli dany plik .cpp potrzebował tej klasy po prostu pisałem w nim #include "KLASA.h", [schemat uproszczony]

jak plik main.cpp potrzebował funkcję funkcja(); to po prostu robiłem tam #include plik2.h który to plik był połączony z plikiem plik2.cpp (zielona linia).

No ale właśnie to nie działa.

I tutaj jest właśnie ta problematyczna klasa, zakładając że wszystkie pliki .cpp potrzebowały klasy, która była w pliku KLASA.h po prostu połączyłem je wszystkie (#include "KLASA.h). Ale wyświetla mi błąd (zdj 2. na dole).

W końcu po szarpaniu się z tym łączenie między plikami stworzyłem połączenie, które nie ma żadnej pętli, takie coś: (uwaga, układ bardzo, bardzo uproszczny)

Teraz, jak plik main.cpp potrzebował funkcję funkcja(); to już nie dodawałem tam pliku2.h tylko plik1.h a ten przekazywał to do pliku2.h i do pliku2.cpp. W pliku1.h, pliku2.h i main.h zapisywałem tylko deklarację funkcji.

To działa ale taki szlak przez pliki .h jest bardzo problematyczny, plików .h w moim projekcie jest dużo dużo więcej. Muszę pamiętać że o pliku KLASA.h wie plik2.h, plik1.h wie o plik2.h a main.h wie o plik1.h.

Czy nie ma jakieś prostszej metody łącznia tego wszystkiego? 

 

Wiem że to pytanie jest strasznie szczegółowe ale jak poprzednio zadałem to samo pytanie nikt nie wiedział o co mi chodzi.

komentarz 18 czerwca 2017 przez draghan VIP (106,230 p.)
Pytanie podstawowe: czy w nagłówkach stosujesz "include-guardy"?
komentarz 18 czerwca 2017 przez Maciek123233 Gaduła (3,400 p.)
Pierwsze widze, pierwsze słysze
komentarz 18 czerwca 2017 przez draghan VIP (106,230 p.)

Linijka #pragma once na początku każdego pliku nagłówkowego (chyba że działasz na jakimś starym kompilatorze, to wtedy konstrukcja z define'ami). Zapobiega ona wielokrotnemu dołączaniu danego nagłówka.

komentarz 18 czerwca 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Używaj albo #pragma once, np.

#pragma once

class Cat
{
public:
    void meow();   
};

Albo:

#ifndef CAT_HPP
#define CAT_HPP

class Cat
{
public:
    void meow();
};

#endif

 

1 odpowiedź

0 głosów
odpowiedź 18 czerwca 2017 przez j23 Mędrzec (195,220 p.)
wybrane 18 czerwca 2017 przez Maciek123233
 
Najlepsza

Dawałeś na początku wszystkich plików nagłówkowych #pragma once?

komentarz 18 czerwca 2017 przez Maciek123233 Gaduła (3,400 p.)
nie? a możesz w skrócie opisać?
komentarz 18 czerwca 2017 przez j23 Mędrzec (195,220 p.)

A co tu w sumie opisywać? Daj na początku każdego pliku nagłówkowego #pragma once i problem powinien zniknąć. Po więcej szczegółów odsyłam do googla z hasłem "include guard"

komentarz 18 czerwca 2017 przez Maciek123233 Gaduła (3,400 p.)
Wszystko działa świetnie, wielki dzięki

Podobne pytania

0 głosów
1 odpowiedź 1,093 wizyt
pytanie zadane 8 października 2016 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
3 odpowiedzi 1,825 wizyt
pytanie zadane 20 kwietnia 2018 w C i C++ przez Treck7 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 1,378 wizyt

93,753 zapytań

142,713 odpowiedzi

323,356 komentarzy

63,347 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...