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

Jak zaprzyjaźnić dwie klasy które są w dwóch różnych plikach header

VPS Starter Arubacloud
0 głosów
562 wizyt
pytanie zadane 22 października 2015 w C i C++ przez niezalogowany
edycja 22 października 2015

Cześć, mam problem, piszę grę i utknąłem troche, na tym żę nie moge zaprzyjaźnić dwóch  klas które znajdują się w odrębnych plikach header. (Dokładniej na przykład jak pobierałem wielkość ekranu to musze zrobić to w prawie każdej klasie i po co mi tyle zmiennych przechowujących rozmiar okna jak mogę to zrobić raz i z tego korzystać) , nie będę umieszczał kodu gry bo nie sądze żę komus chce się analizować 600  lini kodu, umieszczę mały dydaktyczny przykład samej idei tego co chciałem zrobić. To samo tyczy się, dziedziczenia jak to zrobić gdy klasy są w dwóch odrębnych plikach.

#include <iostream>
#include "klasa.h"
#include "zapklasa.h"

using namespace std;

int main(void)
{

    Klasa k;
    Zapklasa z;
    k.wyswietl();
    z.zmien_tajnego_inta(k);

}

 

class Klasa
{
    int tajny_int;
public:
    Klasa(int=1);
    void wyswietl();
    friend class Zapklasa;
};

 

#include "klasa.h"
class Zapklasa
{
public:
    void zmien_tajnego_inta(Klasa &k);
};

 

#include <iostream>
#include "zapklasa.h"

void Zapklasa::zmien_tajnego_inta(Klasa &k)
{
    k.tajny_int=0;
    std::cout<<"TWOJ TAJNY TERAZ TO: "<<k.tajny_int;
}


#include <iostream>
#include "klasa.h"

Klasa::Klasa(int bardzo_tajny_int)
{
    tajny_int=bardzo_tajny_int;
}
void Klasa::wyswietl()
{
    std::cout<<"TWOJ TAJNY INT: "<<tajny_int;
}

EDIT:

Zapomnaiałem dodać co wypluwa kompilator:

||=== Build: Debug in Przyjazn_klas_dwa_pliki (compiler: GNU GCC Compiler) ===|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/zapklasa.cpp||In member function ‘void Zapklasa::zmien_tajnego_inta(Klasa&)’:|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/zapklasa.cpp|6|error: invalid use of incomplete type ‘class Klasa’|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/zapklasa.h|1|error: forward declaration of ‘class Klasa’|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/zapklasa.cpp|7|error: invalid use of incomplete type ‘class Klasa’|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/zapklasa.h|1|error: forward declaration of ‘class Klasa’|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

2 odpowiedzi

0 głosów
odpowiedź 22 października 2015 przez criss Mędrzec (172,590 p.)
wybrane 22 października 2015
 
Najlepsza
Zaincluduj klasa.h w zapklasa.h. Zapklasa musi widzieć definicje Klasy, żeby móc korzystać z jej instancji w funkcji.

Klasy nie muszą się widzieć, żeby zadeklarować przyjaźń między nimi, więc te forward declary-y są niepotrzebne.
komentarz 22 października 2015 przez niezalogowany

Poprawiłem tym razem wypluwa coś takiego

/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/klasa.h|1|error: redefinition of ‘class Klasa’|
/home/metrobot/Documents/cppo/Przyjazn_klas_dwa_pliki/klasa.h|1|error: previous definition of ‘class Klasa’|

 

komentarz 22 października 2015 przez criss Mędrzec (172,590 p.)
A masz include guardy albo #pragma once w *.h? Wyggogluj i popraw :)

Jesli bedziesz miał problem, to wytłumacze.
komentarz 22 października 2015 przez niezalogowany
edycja 22 października 2015

Dzięki , po dodaniu do pliku klasa.h dyrektywy #pragma once faktycznie działa, poczytałem troche wógóle o dyrektywach preprocesora, zawsze myślałem że w sumie to do niczego nie potrzebne bo nigdy nie miałem potrzeby używać innych dyrektyw niż #include i #define, jakbyś mógł wytłumaczyc po co uzywa sie include guardów i jak się ich uzywa oprócz pragma once to byłbym wdzięczny i jak możesz podrzucić jakiś linkiem do fajnych materiałów o  dyrektywach preprocesora i i ch zastosowaniu to było by już świetnie :)

EDIT

Czy dyrektywach preprocesora wystarczy wiedzieć tyle -> https://pl.wikipedia.org/wiki/Preprocesor#Preprocesor_j.C4.99zyk.C3.B3w_C_i_C.2B.2B

Czy warto wiedzieć coś więcej

komentarz 22 października 2015 przez criss Mędrzec (172,590 p.)
edycja 23 października 2015 przez criss

Sam korzystam tylko z define, include i pragma once, więc ci nie powiem :P Ogólnie raczej nie warto wiedzieć, dopóki ci nie będzie potrzebne. One służą tylko do kontrolowania procesu kompilacji i ew. do makr (define).

W linku, ktory podrzuciłeś ładnie są pokazane include guardy. Z reguły się używa ich, a nie #pragma once, tylko dlatego, że niektóre kompilatory ich nie obsługują (nie obsł. pragma once - edit dla jasnosci).

Możesz przeczytać to: http://www.cplusplus.com/forum/articles/10627/

Powinno ci troche rozjaśnić i doprecyzować jak, gdzie, kiedy i dlaczego :)

0 głosów
odpowiedź 22 października 2015 przez Rogargol Pasjonat (16,600 p.)
Nie wiem czy dobrze rozumiem o co Ci chodzi, ale czy nie wygodniej byloby żebyś miał klasę ekran odpowiadajaca za rysowanie na ekranie, a nastepnie w kazdym obiekcie ktory używa ekranu, przechowywał wskaznik do obiektu typu ekran?
komentarz 22 października 2015 przez niezalogowany
Faktycznie można nawet to zrobić za pomocą prostych getterów i setterów,. Polimorfizm się nadaje to fakt (a nawet jest lepszy niż to co ja wymyśliłem!)ale ja jeszcze niezbyt dobrze umiem go używać, z resztą chciałbym się dowiedzieć  jak zaprzyjaźnić te dwie klasy w dwóch osobnych plikach.

Podobne pytania

0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 23 grudnia 2016 w C i C++ przez Konrad Groń 1 Użytkownik (770 p.)
0 głosów
2 odpowiedzi 286 wizyt
0 głosów
4 odpowiedzi 258 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez devi Początkujący (320 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 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!

...