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