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

question-closed Includowanie kilku plików w przypadku polimorfizmu - problem z redeklaracja klasy podstawowej.

VPS Starter Arubacloud
0 głosów
414 wizyt
pytanie zadane 8 października 2015 w C i C++ przez Teagle Nowicjusz (210 p.)
zamknięte 8 października 2015 przez Teagle

Witam, jestem początkującym w C++. Próbuję napisać program, który będzie mi liczyć powierzchnię użytkową dla różnego rodzaju obiektów (domku rodzinnego, biurowca). Na początek postanowiłem zacząć od bardzo prostego kodu jednak już na tym etapie mam pewien problem.

Mam 3 klasy: Budynek, Dom_jednorodzinny, Biurowiec. Wszystkie są w osobnych plikach .h i .cpp. Klasa Budynek jest klasą abstrakcyjną, po której dziedziczą pozostałe. Problem siedzi w inkludach: w pliku dom_jednorodzinny.h jest #include "budynek.h", tak samo jak w pliku biurowiec.h. Potem w dom_jednorodzinny.cpp jest #include "dom_jednorodzinny.h", a w biurowiec.cpp jest #include "biurowiec.h". W main.cpp  kolei zainkludowałem: #include "dom_jednorodzinny.h" i #include "biurowiec.h".

Kiedy startuję program pojawia się problem: "error: redefinition of 'class Budynek'" i "error: previous definition of 'class Budynek'". Poniżej kod wszystkich plików:

budynek.h:

#include <iostream>

using namespace std;

class Budynek
{
protected:
    double metraz;
    double wysokosc;
    double wymiar_a;
    double wymiar_b;
    double ilosc_pieter;
public:
    virtual double policz_powierzchnie_uzytkowa() = 0;
};

dom_jednorodzinny.h:

#include <iostream>
#include "budynek.h"
using namespace std;

class Dom_jednorodzinny : public Budynek
{
public:
    virtual double policz_powierzchnie_uzytkowa();
};

dom_jednorodzinny.cpp:

#include <iostream>
#include "dom_jednorodzinny.h"
using namespace std;

double Dom_jednorodzinny::policz_powierzchnie_uzytkowa()
{
    cout << "Licze powierzchnie uzytkowa domu jednorodzinnego..." << endl;
    return 3.14;
}

biurowiec.h:

#include <iostream>
#include "budynek.h"
using namespace std;

class Biurowiec : public Budynek
{
public:
    virtual double policz_powierzchnie_uzytkowa();
};

biurowiec.cpp:

#include <iostream>
#include "biurowiec.h"
using namespace std;


double Biurowiec::policz_powierzchnie_uzytkowa()
{
    cout << "Licze powierzchnie uzytkowa biurowca..." << endl;
    return 6.28;
}

main.cpp:

#include <iostream>
#include "dom_jednorodzinny.h"
#include "biurowiec.h"
using namespace std;

int main()
{
    cout << "Zaczynamy!" << endl;

    Budynek *wsk_b1;

    Dom_jednorodzinny domek;
    Biurowiec budynek_biurowy;

    wsk_b1 = &domek;
    wsk_b1->policz_powierzchnie_uzytkowa();

    wsk_b1 = &budynek_biurowy;
    wsk_b1->policz_powierzchnie_uzytkowa();


    return 0;
}

Z góry dziękuję za pomoc :)

 

komentarz zamknięcia: Rozwiązano

2 odpowiedzi

+1 głos
odpowiedź 8 października 2015 przez Radfler VIP (101,030 p.)
wybrane 8 października 2015 przez Teagle
 
Najlepsza

W C++ warto umieszczać w każdym pliku .h tzw. strażnika nagłówka:

#ifndef PLIK_H
#define PLIK_H

// Wszystkie definicje/deklaracje

#endif // PLIK_H

Gdzie PLIK_H to jakaś unikalna nazwa (np. nazwa pliku), z której nie będziesz korzystał w swoim programie. A błąd redeklaracji wynika z tego, że Twój nagłówek (budynek.h) pojawia się dwa razy (warto przeczytać: http://en.cppreference.com/w/cpp/language/definition)

Pozdrawiam! :)

PS. Nie warto korzystać z '#pragma once', gdyż nie wszystkie kompilatory to wspierają ;)

komentarz 8 października 2015 przez Teagle Nowicjusz (210 p.)
Wielkie dzięki, pomogło ! :)
komentarz 8 października 2015 przez adrian17 Ekspert (344,100 p.)

PS. Nie warto korzystać z '#pragma once', gdyż nie wszystkie kompilatory to wspierają ;)

Jeśli piszesz programy na Windowsy/Linuxy/Maki (a nie jakieś mikroprocesory ze specyficznymi kompilatorami), to wszystkie znaczące się z ostatnich 10 lat je wspierają.

komentarz 8 października 2015 przez Radfler VIP (101,030 p.)
Standard z tego co wiem nie wspomina o '#pragma once' więc preferuję nie używanie tego.
komentarz 8 października 2015 przez adrian17 Ekspert (344,100 p.)
Standard wspomina o `#pragma XYZ` - implementacja języka może implementować i dostarczać pragmy według własnego uznania, do tego właśnie służą. Na przykład używanie OpenMP opiera się głównie na pragmach. A `#pragma once` oraz `#pragma pack` są ogólnie najbardziej rozpowszechnionymi z nich.
+1 głos
odpowiedź 8 października 2015 przez Szykem2 Nałogowiec (29,510 p.)

Chodzi o to, że niie masz strażnika nagłówka zabezpieczającego przed wielokrotnym załączaniem jeknego pliku. W pliku budynek.h dodaj na początku linikę i ten błąd powinien zniknąć

#pragma once

 

komentarz 8 października 2015 przez Teagle Nowicjusz (210 p.)
Dzięki za odzew :)

Podobne pytania

0 głosów
1 odpowiedź 323 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez military Obywatel (1,120 p.)
0 głosów
3 odpowiedzi 204 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez Michał Gawliczek Nowicjusz (190 p.)
0 głosów
2 odpowiedzi 1,808 wizyt
pytanie zadane 28 sierpnia 2015 w C i C++ przez Mieszko I Stary wyjadacz (10,980 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...