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

Klasy w oddzielnym plikach [C++]

Ostatnio zmodyfikowano 2016-10-22 17:31
Autor Wiadomość
Fafkorn
Temat założony przez niniejszego użytkownika
Klasy w oddzielnym plikach [C++]
» 2016-10-21 17:18:58
Witam mam problem, stworzyłem program składający się z 7 plików: main, 3 pliki cpp i 3 pliki nagłówkowe do nich. Main korzystający z pierwszego pliku .h i .cpp do niego działa dobrze. Problem zaczyna się, kiedy druga klasa korzysta ze zmiennych z pierwszej, wtedy wyskakuje: '... was not declared in this scope'. Po dodaniu do wszystkich plików .cpp bibliotek z pozostałymi nagłówkami problem dalej występuje.
P-152729
mateczek
» 2016-10-21 17:29:23
1 pytanie czy pliki dodałeś do projektu w jakimś ide??
2 kod poszczególnych klas jeśli nie są zbyt skomplikowane wklej na forum
3 błąd o którym piszesz sugeruje, że plik *.cpp lub *.h nie ma dołączonego nagłówka klasy z której korzysta. lub przekombinowałeś w zależnościach. Na sucho ciężko coś powiedzieć
P-152731
Fafkorn
Temat założony przez niniejszego użytkownika
» 2016-10-21 17:43:07
Tak, kod nie jest zbyt skomplikowany. Nie zajmowałem się jeszcze dostępem private/public, to miała być kolejna część.

main.cpp
C/C++
#include "kierowca.h";
#include "mechanik.h";
#include "samochod.h";
#include<iostream>
using namespace std;

int main()
{
    Samochod s1( 9, false ); //tworzenie pierwszego obiektu z klasy samochod
    Samochod s2( 30, true ); //tworzenie drugiego obiektu z klasy samochod
    Mechanik m1; //tworzenie obiektu z klasy mechanik
    Kierowca k1; //tworzenie obiektu z klasy kierowca
   
   
    cout << "Poziom paliwa: " << s1.dajPoziomPaliwa() << endl;
    cout << "Poziom paliwa: " << s2.dajPoziomPaliwa() << endl;
    cout << "Stan techniczny: " << s1.dajStanTechniczny() << endl;
    cout << "Stan techniczny: " << s2.dajStanTechniczny() << endl;
    cout << "Czy moge jechac? ... " << s1.czyMogeJechac() << endl;
    return 0;
}

samochod.h
C/C++
#pragma once

class Samochod
{
public:
   
    int poziomPaliwa;
    bool stanTechniczny;
   
    int dajPoziomPaliwa();
    bool dajStanTechniczny();
};

samochod.cpp
C/C++
#include "samochod.h"
#include "kierowca.h"

Samochod::Samochod( int q, bool w )
{
    poziomPaliwa = q;
    stanTechniczny = w;
}

int Samochod::dajPoziomPaliwa()
{
    return poziomPaliwa;
}

bool Samochod::dajStanTechniczny()
{
    return stanTechniczny;
}

kierowca.h
C/C++
#pragma once

class Kierowca
{
public:
    bool czyMogeJechac();
};

kierowca.cpp
C/C++
#include "kierowca.h"
#include "samochod.h"

bool Kierowca::czyMogeJechac()
{
    if( stanTechniczny == false || poziomPaliwa < 10 ) return false;
    else return true;
   
}

mechanik.h
C/C++
#pragma once

class Mechanik
{
public:
    void napraw();
};

mechanik.cpp
C/C++
#include "mechanik.h"
#include "samochod.h"

void Mechanik::napraw()
{
    stanTechniczny = true;
    poziomPaliwa = 60;
}
P-152732
mateczek
» 2016-10-21 18:15:27
problem nie leży w plikach ale w złym użyciu klas. Nie możesz to tak w jednej klasie używać sobie nazw zmiennych z innej klasy bez odwołania do konkretnego obiektu tej drugiej klasy
C/C++
#include "kierowca.h";
#include "mechanik.h";
#include "samochod.h";
#include<iostream>
using namespace std;

int main()
{
    samochod s1( 9, false ); //tworzenie pierwszego obiektu z klasy samochod
    kierowca k;
    mechanik m;
   
    if( k.czyMogeJechac( s1 ) )
         cout << "zasuwaj" << endl;
    else
         cout << "popsuty" << endl;
   
    m.napraw( s1 );
   
    if( k.czyMogeJechac( s1 ) )
         cout << "zasuwaj" << endl;
    else
         cout << "popsuty" << endl;
   
    return 0;
}

poniżej dam Ci nagłówki poszczególnych klas
klasa kierowca:
C/C++
#ifndef KIEROWCA_H
#define KIEROWCA_H
#include<samochod.h>

class kierowca
{
public:
    kierowca();
    bool czyMogeJechac( samochod & s );
};

#endif // KIEROWCA_H

i plik kierowca.cpp
C/C++
#include "kierowca.h"

kierowca::kierowca()
{
   
}

bool kierowca::czyMogeJechac( samochod & s )
{
    if( s.dajStanTechniczny() == false || s.dajPoziomPaliwa() < 10 ) return false;
    else return true;
   
}

klasa mechanik:
C/C++
#ifndef MECHANIK_H
#define MECHANIK_H
#include <samochod.h>

class mechanik
{
public:
    mechanik();
    void napraw( samochod & _samochod );
};

#endif // MECHANIK_H

i plik mechanik.cpp
C/C++
#include "mechanik.h"

mechanik::mechanik()
{
   
}

void mechanik::napraw( samochod & _samochod )
{
    _samochod.stanTechniczny = true;
    _samochod.poziomPaliwa = 60;
}

klasa samochod plik samochod.h

C/C++
#ifndef SAMOCHOD_H
#define SAMOCHOD_H

class samochod
{
    friend class mechanik;
    int poziomPaliwa;
    bool stanTechniczny;
   
public:
    samochod( int q, bool w );
    int dajPoziomPaliwa();
    bool dajStanTechniczny();
};

#endif // SAMOCHOD_H
i plik samochod.cpp
C/C++
#include "samochod.h"

samochod::samochod( int q, bool w )
{
    poziomPaliwa = q;
    stanTechniczny = w;
}


int samochod::dajPoziomPaliwa()
{
    return poziomPaliwa;
}

bool samochod::dajStanTechniczny()
{
    return stanTechniczny;
}
P-152734
Fafkorn
Temat założony przez niniejszego użytkownika
» 2016-10-22 14:52:44
Dużo zmieniłeś w moim kodzie, nie dało się tego naprawić zmieniając tylko odwołania do bibliotek?
P-152750
carlosmay
» 2016-10-22 15:17:48
Dużo zmieniłeś w moim kodzie, nie dało się tego naprawić zmieniając tylko odwołania do bibliotek?
Nic nie stoi na przeszkodzie w przerobieniu go swój sposób z uwzględnieniem
Nie możesz to tak w jednej klasie używać sobie nazw zmiennych z innej klasy bez odwołania do konkretnego obiektu tej drugiej klasy
.
P-152753
Fafkorn
Temat założony przez niniejszego użytkownika
» 2016-10-22 15:24:06
Ale jaka jest zasada używania zmiennych pomiędzy klasami?
P-152754
mateczek
» 2016-10-22 15:26:26
wcale nie zmieniłem dużo. Zmieniłem tylko deklaracje funkcji
C/C++
//z takich
bool czyMogeJechac();
// na take
bool czyMogeJechac( samochod & s );

i funkcje "mian()" by zaprezentować działanie wszystkich metod klasy kierowca i mechanik. Mechanikowi dałem przyjaźń z samochodem by mógł zmieniać sobie składowe prywatne. I to wszystko.
Dyrektywy "#define" dodaje moje IDE przy tworzeniu nowej klasy. Zapobiega to kilkukrotnemu włączeniu do kodu tego samego nagłówka.
C/C++
//taki kod jest nawet nie logiczny
void Mechanik::napraw() //co ma naprawić ?? siebie ?? kod ma tylko sens gdyby mechanik naprawiał siebie
{
    stanTechniczny = true; //czyj stan techniczny ?? jeśli przed składową nie stoi obiekt to domyślnie jest to "this"
    poziomPaliwa = 60; // podobnie jak wyżej mechanik tankuje siebie :) to akurat mogło by mieć sens gdyby wynik był w promilach :P
}
P-152756
« 1 » 2
  Strona 1 z 2 Następna strona