Dziecziczenie class c++ i wprowadzanie informacji.

0

Witam!
Uczę się programowania obiektowego, teraz przerabiam classy i ich dziedziczenie.
Mam takie pytanie i problem.
Oto mój kod:
plik punkt.h

 #ifndef PUNKT_H
#define PUNKT_H


class Punkt
{
    public:
        Punkt();
        Punkt(float x, float y, float z);
        void przesun(float vx,float vy, float vz);
        virtual ~Punkt();
    protected:
        float x;
        float y;
        float z;
    private:
};

class Kula : Punkt
{
    public:
        Kula();
        Kula(float r);
        virtual ~Kula();
    protected:
        float r;
    private:
};

#endif // PUNKT_H

plik punkt.cpp

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

using namespace std;

Punkt::Punkt()
{
    x=y=z=0;
}
Punkt::Punkt(float x, float y, float z)
{
    this->x=x;
    this->y=y;
    this->z=z;
}
void Punkt::przesun(float vx, float vy, float vz)
{
    cout << "Punkt po przesunieciu ma wspolrzedne: (" << x+vx << "," << y+vy << "," << z+vz << ")." << endl;
}

Kula::Kula()
{
    x=y=z=r=0;
}

Kula::Kula(float r)
{
    this->r=r;
}

Punkt::~Punkt()
{
    //dtor
}
 

plik main.cpp

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

using namespace std;

int main()
{
    cout << "" << endl;
    return 0;
}
 

Moim zadaniem jest:

Mam zrobić dziedziczenie klasy Punkt, tworząc klasę kula, klasa kula będzie wykożystywać współrzędne środka kuli z klasy Punkt i obliczać PCC i V (te funkcje to nie problem), problem w zrozumieniu mam, jak wprowadzać dane, klasa kula ma posiadać dodatkowy argument r - który będzie promieniem. W main.cpp, gdy próbowałem napisać Kula obiekt1(1,1,1,1); - wyskoczył mi błąd, i nie rozumiem dlaczego. Nauczyciel również niewytłumaczył dlaczego classa wygląda tak:

class Punkt
{
    public:
        Punkt();
        Punkt(float x, float y, float z);
        virtual ~Punkt();
    protected:
        float x;
        float y;
        float z;
    private:
}; 

Dlaczego jest Punkt(), później znów Punkt, lecz z argumentami, a następnie jest virtual i ~Punkt();
rozumiem że ~Punkt służy jako destruktor, ale virtual??
Nie mogłem znaleźć w internecie odpowiedzi na moje pytanie, więc postanowiłem zapytać was.

PS. Czy zamiast pisać w punkt.h
Punkt();
Punkt(argumenty);
Mogę napisać tylko Punkt(argumenty); i wtedy w punkt.cpp

Punkt::Punkt(float x, float y, float z)
{
    x=y=z=0;
    this->x=x;
    this->y=y;
    this->z=z;
}

? Dzieki z apomoc.

1

Co to za dziwny pomysł, żeby klasa Kula dziedziczyła z klasy Punkt. Czy kula jest rodzajem punktu? Jeżeli uczą Was programowania obiektowego w ten sposób, to jest to bardzo smutne.

Nie możesz zrobić Kula obiekt1(1,1,1,1); bo klasa Kula nie ma takiego konstruktora. Ma tylko taki: Kula obiekt1(1);. Oczywiście to niedobrze, prawdopodobnie powinna mieć właśnie taki z czterema argumentami, w którym najpierw stworzysz obiekt klasy bazowej korzystając z jej konstruktora z trzema argumentami.

Nie możesz tak napisać, bo to nie jest to samo. W dodatku zerowanie a potem ustawianie nie ma żadnego sensu. Żeby zrobić z tego jeden konstruktor musiałbyś mieć:

Punkt::Punkt(float x = 0.0f, float y = 0.0f, float z = 0.0f) :
  x(x),
  y(y),
  z(z)
{
}

Poczytaj o liście inicjalizacyjnej konstruktora.

0

Hm, poczytałem i pozmieniałem parę rzeczy w moim programie, jedyne czego nie rozumiem, to dlaczego ten fragment kodu nie chce zadziałać::

#ifndef PUNKT_H
#define PUNKT_H


class Punkt
{
    public:
        Punkt(float x, float y, float z) :
                x(x),y(y),z(z)
                {

                }
        void przesun(float vx,float vy, float vz);
        void druk();
        virtual ~Punkt();
    protected:
        float x;
        float y;
        float z;
    private:
};

class Kula : Punkt
{
    public:
        Kula(float x, float y, float z, float r):
            Punkt::x(x), Punkt::y(y), Punkt::z(z), r(r)
            {

            }

        virtual ~Kula();
    protected:
        float x;
        float y;
        float z;
        float r;
    private:
};

#endif // PUNKT_H
 

Chodzi tu głównie o : Punkt::x(x), Punkt::y(y), Punkt::z(z), r(r)

Chcąc się odwołać np w ten sposób: Punkt.x(x) również mam błędy od kompilatora - jak odwoływać się do zmiennych z klasy pierwotnej ?

1

Po co powtarzasz składowe w klasie pochodnej? Przecież one są już w bazowej i tam mają zostać.

W liście inicjalizacyjnej konstruktora klasy pochodnej powinieneś wywołać konstruktor klasy bazowej:

Kula(float x, float y, float z, float r) :
  Punkt(x, y, z),
  r(r) {
}

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