Wątek przeniesiony 2019-01-02 12:02 z Newbie przez Adam Boduch.

Deklaracja klasy ponad funkcja main

0

Witam. Chciałbym się zapytać, czy w C++ można powyżej funkcji main napisać jedynie deklaracje klasy, a jej ciało napisać pod funkcją main? Z zwykłymi funkcjami można tak zrobić, że na samej górze umieszczamy jedynie nagłówki funkcji, a cała reszta jest na dole. Napisałem taki programik:

#include <iostream>

using namespace std;

class Osoba; //czy mozna zadeklarowac klase, a jej cialo napisac na dole?

int main()
{
    Osoba o1; //blad kompilacji 

    o1.wyswietl();

    return 0;
}

class Osoba
{ //cialo klasy
public:
    string imie="brak";
    int wiek=2;

    void wyswietl()
    {
        cout<<imie<<endl;
        cout<<wiek<<endl;
    }

};

Wiem, że wygodnym sposobem jest podział programu na pliki z rozszerzeniem cpp i hpp, ale z czystej ciekawości pytam, czy można tak zrobić.

3

Wartościowa lektura: https://jonjagger.blogspot.com/2013/04/the-include-test.html

Możesz tak zrobić, ale wtedy nie możesz użyć klasy jako pełnego typu. Możesz zdefiniować klasę, ale nie zdefiniować jej funkcji w jej ciele, i wtedy funkcje możesz zdefiniować gdzie chcesz1

1dla odpowiedniej definicji "gdzie chcesz"

0

Mam jeszcze jedno pytanie. Napiszę tutaj, bo nie chcę specjalnie tworzyć nowego tematu.

Chciałem napisać prosty program z klasą, w której będą dwa konstruktory przeciążone, abym podczas tworzenia obiektu klasy miał wybór, czy chcę podawać wartości do pól, czy zostawić je z wartością domyślną. Napisałem taki program:

#include <iostream>
#include <string>
#include <cctype>
#include <windows.h>

using namespace std;

class Osoba
{
private:
    string imie;
    int wiek;
    int wzrost;
public:
    Osoba() //konstruktor domyslny
    {
        imie="brak";
        wiek=0;
        wzrost=0;
    }
    Osoba(string imie="brak", int wiek=0, int wzrost=0) //konstruktor wieloargumentowy
    {
        this->imie=imie;
        this->wiek=wiek;
        this->wzrost=wzrost;

    }

    void wyswietl()
    {
        cout<<"Dane"<<endl;
        cout<<"Imie: "<<imie<<endl;
        cout<<"Wiek: "<<wiek<<endl;
        cout<<"Wzrost: "<<wzrost<<endl<<endl;
    }
    void podaj()
    {
        cout<<"Podaj dane"<<endl;
        cout<<"Podaj imie: ";
        getline(cin, imie);
        cout<<"Podaj wiek: ";
        cin>>wiek;
        cout<<"Podaj wzrost: ";
        cin>>wzrost;
    }
    void pobierz(string imie, int wiek, int wzrost)
    {
        this->imie=imie;
        this->wiek=wiek;
        this->wzrost=wzrost;
    }

};


int main()
{
    Osoba Karol; //blad kompilacji
    //Karol.podaj();
    //Karol.pobierz("xyz",9,8);

    Karol.wyswietl();


    return 0;
}

Podczas kompilacji pojawia się błąd w zaznaczonej przeze mnie linijce z nst. komunikatem: "error: call of overloaded 'Osoba()' is ambiguous". Potem z poniższej linii:

Osoba(string imie="brak", int wiek=0, int wzrost=0) //konstruktor wieloargumentowy

Usunąłem podane domyślne wartości argumentów i program zadziałał. W komunikacie o błędzie pojawia się słowo overloaded, czyli mam rozumieć, że dochodzi do jakiegoś "przeładowania" podczas kompilacji, bo zarówno w konstruktorze domyślnym, jak i wieloargumentowym zostały podane wartości początkowe? Czyli tak nie można robić?

1

Po prostu nie wiadomo które przeładowanie ma zostać wybrane, skoro oba są równie dobre i oba są równie poprawne.

Na przyszłość: nowe pytanie = nowy temat, nie pozbawiaj ludzi wirtualnych punktów za odpowiedzi + nie mieszaj tematów

1 użytkowników online, w tym zalogowanych: 0, gości: 1