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

Redefinicja klasy

Ostatnio zmodyfikowano 2016-11-02 15:29
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Redefinicja klasy
» 2016-10-22 19:39:40
Witam. W swojej książce "Symfonia c++ standard" Jerzy Grębosz pisze, że warto tworzyć dla każdej klasy osobny plik. Problem jest jednak tu:
C/C++
//--------------------
//PLIK HEAD.H
#include <iostream>
using namespace std;

class X
{
    int a;
    int b;
public:
    void funk()
    {
        a = 5;
        b = 6;
        cout << a << " , " << b;
    }
};
//--------------------
//PLIK HEAD.H2
#include <iostream>
#include "head.h"
using namespace std;

void funk2( X r )
{
    r.funk();
}

//-------------------
//PLIK MAIN
#include <iostream>
#include "head.h"
#include "head2.h"
using namespace std;
int main()
{
    X abc;
    abc.funk();
    funk2( abc );
}
Program wyrzuca następujące błędy:
||=== Build: Debug in projekt5 (compiler: GNU GCC Compiler) ===|
D:\Inne_z_pulpitu\projekt5\head.h|4|error: redefinition of 'class X'|
D:\Inne_z_pulpitu\projekt5\head.h|4|error: previous definition of 'class X'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Podobno tak być nie powinno. O co chodzi?
P-152767
mateczek
» 2016-10-22 19:53:04
Masz podwójnie dołączony plik nagłówkowy
Dlatego IDE automatycznie dołączają takie wstawki by zapobiec temu 
C/C++
#ifndef KLASA_H
#define KLASA_H


#endif // KLASA_H


C/C++
#include <iostream>
//#include "head.h" //wywal ten nagłówek
#include "head2.h"
using namespace std;
int main()
{
    X abc;
    abc.funk();
    funk2( abc );
}
P-152768
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-22 20:09:23
Ohhh :D
Nie podejrzewałem tego, bo autor pisał, że IDE samo nam to załatwi.
Dzięki
P-152769
mateczek
» 2016-10-22 20:28:33
jeśli w menu IDE "dasz dodaj nową klasę" to szablon nowej klasy doda na wstępie te dyrektywy 
P-152770
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-23 02:00:29
Czyli jeśli w pliku np. Main dołączymy pliki X oraz Y to plik X bedzie mógł korzystać ze zmiennych itp. z pliku Y?
P-152782
mateczek
» 2016-10-23 07:58:34
nie będzie mógł. trzeba zrobić tak :
C/C++
//...........................................................................................
//plik x.h
//...........................................................................................
#include y.h
//[...]




//...........................................................................................
//plik main
//...........................................................................................
#include x.h
//#include y.h // nie wolno
int main() {
    y zmiennaTypuY; //mimo że bezpośrednio dołączony jest tylko "x.h" może korzystać z "y"
   
}

//specjane dyrektywy o których była mowa w wątku wcześniej zabezpieczają przed tatowymi działaniami. I  jeśli się robi zgodnie ze sztuką
//coś w stylu menu>>dodaj nową klasę
//to IDE (przynajmniej u mnie) generuje dyrektywy zabezpieczające
P-152784
pekfos
» 2016-11-02 15:29:06
Czyli jeśli w pliku np. Main dołączymy pliki X oraz Y to plik X bedzie mógł korzystać ze zmiennych itp. z pliku Y?
Jeśli pliki będą zawsze dołączane we właściwej kolejności, to tak. Jednak poleganie na kolejności dołączania to zła praktyka.
P-153250
« 1 »
  Strona 1 z 1