• 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

Object Storage Arubacloud
0 głosów
2,542 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 (194,920 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 (194,920 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ź 760 wizyt
pytanie zadane 8 października 2016 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
3 odpowiedzi 1,193 wizyt
pytanie zadane 20 kwietnia 2018 w C i C++ przez Treck7 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 897 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...