Wywołanie konstruktora z klasy nadrzędnej

0

Cześć, mam następujący problem. Mam klasę Punkt:

#pragma once
#include <string>

using namespace std;

class Punkt
{
protected:
    float x, y;
    string nazwa;
public:
    Punkt(float = 0, float = 0, string = "A");    // Konstruktor z wartościami domyślnymi 
    ~Punkt();                           
    void wyswietl();                                //Metoda wyświetlająca info             

};

Oraz dziedziczącą po niej klasę Kula :

#pragma once
#include "Punkt.h"
#include <string>

using namespace std; 

class Kula :
    protected Punkt
{
protected:
    string nazwa;  // Przesłaniam pole nazwa z klasy Punkt
    float promien;
public:
    Kula(float=0,float=0,float=0,string="kula_1");  // Konstruktor z wartościami domyślnymi dla klasy Kula 
    ~Kula();
    void wyswietl();  // Przesłaniam metodę z klasy Punkt
};

Ciało konstruktora z klasy Punkt wygląda tak:

Punkt::Punkt(float x,float y,string nazwa)
{
    this->x = x;
    this->y = y;
    this->nazwa = nazwa;
}

A ciało konstruktora z klasy Kula wygląda tak:

Kula::Kula(float x,float y, float promien, string nazwa)
{
    Punkt::Punkt(x,y);     // Wywołuje konstruktor z klasy nadrzędnej żeby mi ustawił wartości x,y obiektu klasy Kula
    this->promien = promien; // Ustawiam promien i nazwe, jak ich nie podam to da mi domyślne 
    this->nazwa = nazwa;
}

No i właśnie przy tworzeniu obiektu klasy kula jak podaje

Kula k(2,2) ;
k.wyswietl();

To powinno mi ustawić kule o punkcie (2,2) promieniu 0 i nazwie "kula_1" podczas gdy ciągle wywołuje mi konstruktor z klasy Punkt z wartościami domyślnymi co skutkuje wyświetleniem się punktu (0,0) promieniu 0 i nazwie "kula_1". Proszę o pomoc :> Dziękuję.

3
Punkt::Punkt(x,y);     // Wywołuje konstruktor z klasy nadrzędnej żeby mi ustawił wartości x,y obiektu klasy Kula

Nie. Tworzysz nienazwany obiekt typu Punkt, który kończy swój żywot wraz z ;.

Jeśli chcesz przekazać parametry do konstruktora klasy nadrzędnej, musisz zrobić to w liście inicjalizacyjnej konstruktora:

Kula::Kula(float x,float y, float promien, string nazwa) : Punkt(x, y)
{
    this->promien = promien; // Ustawiam promien i nazwe, jak ich nie podam to da mi domyślne 
    this->nazwa = nazwa;
}

W miarę możliwości powinieneś​tak inicjalizować wszystkie elementy klasy.

Ponadto:

  1. Typy takie jak string przyjmuj przez const referencję, zamiast wymuszać kopie
  2. Kula nie jest Punktem. Twoja hierarchia dziedziczenia absolutnie nie ma sensu.
  3. using namespace std; w nagłówku to zbrodnia.
  4. // Ustawiam promien i nazwe, jak ich nie podam to da mi domyślne ⟵ nie, jak ich nie podasz to będą niezainicjalizowane i będziesz miał UB przy próbie ich odczytu.
0
kq napisał(a):
  1. Typy takie jak string przyjmuj przez const referencję, zamiast wymuszać kopie
  2. // Ustawiam promien i nazwe, jak ich nie podam to da mi domyślne ⟵ nie, jak ich nie podasz to będą niezainicjalizowane i będziesz miał UB przy próbie ich odczytu.

Byłbyś łaskaw rozwinąć to trochę bardziej ?

2
  1. string const& param zamiast string param jako parametr funkcji. Dzięki temu nie kopiujesz zbytecznie parametru.
  2. W C++ niezainicjalizowane zmienne mają nieustalone wartości i ich odczyt to jest UB (undefined behaviour)
2

Mały offtop (bo problem bardzie dotyczy C++, a nie OOP):
Kula nie jest punktem, tylko składa się z właściwości promień oraz punktu określającego położenie środka, więc dziedziczenie w tym przypadku jest nietrafione.

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