Skocz do zawartości

[vc++] problem z naglowkami


r4dical

Recommended Posts

takie male pytanko.
pisze projekt w visuallu bez MFC.
sklada sie on z kilku plikow .h i chcialbym, zeby skladal sie takze z kilku .cpp gdzie umieszczam sobie jakies funkcje.
problem polega na tym , ze do wszystkich klas zawartych w plikach .h moge sie dostac z glownego pliku .cpp. to zrozumiale, bo includuje w tym pliku wszystkie naglowki, w tym ten, gdzie jest klasa, ktorej funkcje wywoluje.
nie potrafie jednak dostac sie do klas jakiegokolwiek naglowka z innego pliku .cpp (czytaj nie glownego.)
nie moge tam zainkludowac plikow .h poniewaz sa juz zainkludowane w glownym .cpp (gdzie jest funkcja main)
nie dzialaja tez polecenie extend. kompilator pisze "undefined class ...". nie wiem jak to zrobic, nie wiem gdzie tak naprawde w kodzie programu jest dodawany taki plik .cpp ktory mam w swoim projekcie.

pozdrawiam i jak zykle licze na kilka zdan fachowcow.
Mariusz

Link do komentarza
Udostępnij na innych stronach

juz wiem, gdzie jest problem, chociaz rozwiazania nie znalazlem.
moge inkludowac wszystkie naglowki w kazdym pliku .cpp i wszystko pieknie smiga. problem pojawia sie jesli jakas klasa zdefiniowana w inkludowanym naglowku posiada cialo jakiejs jej funkcji zdefiniowane poza klasa w tym samym pliku. kompilator podaje wtedy, ze zdefiniowano powtornie ta funkcje.
czyli nadal mam ten sam problem. przytocze przyklad:

klasa1.h

class klasa1
{
   void funkcja (void) {}
};
-------------------------------
klasa2.h

class klasa2
{
   void funkcja (void);
};
void klasa2::funkcja(void) {}
-------------------------
main.cpp

#include klasa1.h
#include klasa2.h

klasa1 k1;       //definicja obiektow globalnych
klasa2 k2;
-------------------------------
dodatkowy.cpp

#include klasa1.h
#include klasa2.h

//i tu przy kompilacji pojawia sie komunikat o powtornym definiowaniu funkcji z klasy2. nie pomaga wyposazenie naglowkow w #pragma czy #ifndef.
do klasy1 kompilator sie nie czepia. klasy mam dosc duze, wiec nie chce cial funkcji umieszczac wewnatrz. z tego co wiem beda umieszczane w calosci w miejscach, gdzie bede je wywolywal.

druga sprawa tak przy okazji.
sprawdzilem w roznych naglowkach i doszedlem, ze jesli mam naglowek ktory nazywa sie np. header.h to ifndef powinno wygladac tak:

#ifndef _header_h_
a pragma tak:
#pragma once _header_h_

czy tak wlasnie powinno byc? moze tu robie blad i jest on powodem reszty komplikacji. z drugiej jednak strony klasa1 kompiluje sie dobrze.

pozdrawiam i rece juz rozkladam. narazie caly progs mam w jednym cpp i to chodzi ale nie wyglada to fajnie.
Mariusz

Link do komentarza
Udostępnij na innych stronach

Dobra praktyka programistycza mówi że nie powinno się definiować funkcji w plikach nagłówkowych. Dlaczego? To chyba już wiesz. Może zrób to w taki sposób:


//klasa1.h

class klasa1
{
   void funkcja(void) {}
};

----------------------------------------------------------

//klasa2.h

class klasa2
{
   void funkcja(void);
}

----------------------------------------------------------

//klasa2.cpp

#include "klasa2.h"

void klasa2::funkcja(void){}

----------------------------------------------------------

Jak widzisz funkcja z klasy klasa2 jest definiowana w pliku klasa2.cpp. Teraz możesz bez problemu dołączać plik klasa2.h tyle razy ile tylko chcesz i nie powinno być żadnych problemów. Pliki klasa2.h i klasa2.cpp stanowią w tym wypadku komplet. Jak widzisz twój plik klasa2.h został rozłożony na dwa mniejsze.
Jeżeli ten opis jest mało zrozumiały to napisz postaram się opisać to szerzej.

Link do komentarza
Udostępnij na innych stronach

dziekuje za podpowiedzi. wyglada na to, ze klopot byl z umieszczaniem cial funkcji w pliku .h razem z klasa. takie rozwiazanie wydawalo sie najlepsze, z reszta chyba tez logiczne. troche mi sie nie podoba ze musze teraz dzielic klase na deklaracje w jednym pliku a funkcje w drugim. ale nic to. rozumiem juz o co chodzilo.

pozdrawiam serdecznie
Mariusz

Link do komentarza
Udostępnij na innych stronach

Szczerze mówiąc nie wiem dlaczego Ci się ten podział nie podoba ale jeżeli koniecznie chcesz mieć to w jednym pliku to może użyj dla funkcji specyfikatora inline. Po krótce mówiąc spowoduje on że kompilator będzie traktował takie funkcje jak by były zdefiniowane wewnątrz klasy a co za tym idzie nie powinno być z nimi problemu. Przykład:


//klasa2.h

class klasa2
{
   inline void funkcja(void);
}

void klasa2::funkcja(void) { }

ps. Pragnę zaznaczyć że nie polecam stosowania tego sposobu. Ma on po prostu wiele wad i nie jest mile widziany przez programistów.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...