Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kilka klas pochodnych, każda w innym pliku

Ostatnio zmodyfikowano 2016-04-08 07:47
Autor Wiadomość
kamil7124
Temat założony przez niniejszego użytkownika
Kilka klas pochodnych, każda w innym pliku
» 2016-04-07 16:43:27
Mam w programie klasę bazową i dwie klasy które publicznie tę klasę dziedziczą. Mam też takie założenie, że każda klasa musi być w osobnym pliku (każda klasa - 1 plik *.cpp i 1 plik *.h). Nie wiem jednak jak utworzyć obiekt klasy pochodnej z poziomu pliku main.cpp.
Oto jak wyglądają pliki mojego projektu:
main.cpp
C/C++
#include <iostream>


using namespace std;

int main()
{
   
    return 0;
}
bazowa.h
C/C++
class bazowa
{
private:
    int dlugoscBoku;
public:
    void ustawdlugoscBoku( int i );
};
bazowa.cpp
C/C++
#include "bazowa.h"

void bazowa::ustawdlugoscBoku( int i )
{
    dlugoscBoku = i;
}
pochodna.h
C/C++
#include "bazowa.h"
class pochodna
    : public bazowa
{
private:
    int glebokosc;
public:
    void ustawGlebokosc( int i );
};
pochodna.cpp
C/C++
#include "pochodna.h"

void pochodna::ustawGlebokosc( int i )
{
    glebokosc = i;
}
druga_pochodna.h
C/C++
#include "bazowa.h"

class druga_pochodna
    : public bazowa
{
private:
    int costam;
public:
    void ustawCostam( int i );
};
druga_pochodna.cpp
C/C++
#include "druga_pochodna.h"

void druga_pochodna::ustawCostam( int i )
{
    costam = i;
}
P-147046
Rashmistrz
» 2016-04-07 18:57:05
Emmm?! :
C/C++
pochodna nazwa_obiektu;
// rób dalej co chcesz na nim
nazwa_obiektu.ustawGlebokosc( 42 );

Klas używa się jak struktur...

W zasadzie... struktury to też klasy,
tylko że nie mają metod. :D
P-147049
carlosmay
» 2016-04-07 19:06:18
Wyższość klas nad strukturami
struct

W zasadzie... struktury to też klasy,
tylko że nie mają metod. :D
Tak było w C (źródła czytane).
W C++ już nie.
P-147050
kamil7124
Temat założony przez niniejszego użytkownika
» 2016-04-07 20:41:15
Nie o to mi chodzi ;) Problem jest w tym, że nie wiem jak dołączyć pliki *.h do main.cpp. Jeśli zrobię w ten sposób:
C/C++
#include "pochodna.h"
#include "druga_pochodna.h"
to z racji tego, że zarówno w pochodna.h jak i w druga_pochodna.h jest
C/C++
#include "bazowa.h"
Kompilator wywali mi błąd, ponieważ pośrednio (przez pliki nagłówkowe pochodnych) dwa razy dołączyłem plik bazowa.h, a on to widzi tak jakbym za dużo razy zdefiniował klasę bazową.
Moje pytanie brzmi - czy jest jakiś sposób żeby to obejść, czy może jestem zmuszony umieszczać wszystkie klasy pochodne w jednym pliku?

Ps.: Wiem że powinienem był to umieścić w pierwszym poście, zapomniałem ;(
P-147055
carlosmay
» 2016-04-07 20:56:38
Możesz tego spróbować.
C/C++
#ifndef nazwaPliku_hpp
#define nazwaPliku_hpp
/*
  tutaj piszesz cały interfejs
*/
#endif
Choć nie wiem czy pomoże.

Kompilator wywali mi błąd, ponieważ pośrednio (przez pliki nagłówkowe pochodnych) dwa razy dołączyłem plik bazowa.h
Bazową zrób klasą abstrakcyjną.

Lepiej zaprojektuj klasy.

P-147057
mokrowski
» 2016-04-07 21:17:42
1. Porzuć raczej przyzwyczajenie nazywania plików nagłówkowych dla C++ z końcówką *.h. Takie pliki sugerują że dają się użyć w kontekście języka C a u Ciebie to nie prawda. Nazywaj je raczej *.hpp lub.. jeszcze inaczej (konwencji jest bez liku), ale nie *.h
2. Zamiast już dość leciwej techniki użycia makr wartowniczych (co pokazał kolega carlosmay), warto użyć pragmy. W niektórych przypadkach działa szybciej (wiele nagłówków) a po drugie wszędzie gdzie się da należy unikać makr :-)
Twój plik bazowa.h będzie wyglądał wtedy tak:
C/C++
#pragma once

class bazowa
{
private:
    int dlugoscBoku;
public:
    void ustawdlugoscBoku( int i );
};
3. W C++ nie ma obowiązku "zwracania zera z main()". To było wymaganie dla C (bez plusów). W C++ kompilator w main() sam podstawia zero jeśli nie wpiszesz return.
P-147060
Elaine
» 2016-04-08 05:21:18
Zamiast już dość leciwej techniki użycia makr wartowniczych (co pokazał kolega carlosmay), warto użyć pragmy.
#pragma once, choć może się wydawać atrakcyjne, w rzeczywistości jest problematyczne, ponieważ nie ma ściśle określonej semantyki. Co dokładnie robi #pragma once? Pod każdym kompilatorem, który to implementuje, powoduje, że tylko pierwsze #include danego pliku ma efekt. To wydaje się łatwe, proste i przyjemne, ale jest niemożliwe do zaimplementowania, bowiem w dzisiejszych systemach operacyjnych nie da się określić, czy dwie ścieżki określają ten sam plik. W praktyce kompilatory przybliżają to porównując numer urządzenia i iwęzła, ale w Prawdziwym Świecie™ łatwo doprowadzić do sytuacji, w której dwa pliki o różnej parze (dev, ino) są w rzeczywistości tym samym plikiem; nie mówiąc już o zwyczajnej kopii pliku (zawartość ta sama, inny plik). Tradycyjne wartowniki nie mają z poprawnym zachowywaniem się w takich sytuacjach żadnego problemu.
W niektórych przypadkach działa szybciej (wiele nagłówków)
Kompilatory potrafią rozpoznawać wartowniki i używać dla nich tej samej logiki, co dla #pragma once.


W C++ nie ma obowiązku "zwracania zera z main()". To było wymaganie dla C (bez plusów).
W C main również może nie kończyć się returnem, i również jest to równoważne return 0.
P-147063
kamil7124
Temat założony przez niniejszego użytkownika
» 2016-04-08 07:47:27
Na razie wypróbowałem technikę z #ifndef/#define/#endif, oraz z #pragma once. Obie działają jak należy, więc dziękuje Wam ;) Z klasą abstrakcyjną pokombinuję jak będę miał więcej czasu.
P-147065
« 1 »
  Strona 1 z 1