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

Problem z dostępem do atrybutów klasy dziedziczącej z innej klasy.

Object Storage Arubacloud
0 głosów
516 wizyt
pytanie zadane 24 lipca 2020 w C i C++ przez maks0410 Początkujący (290 p.)

Cześć, próbowałem dzisiaj zmierzyć się z odcinkiem 5 programowania obiektowego w C++ Pana Zelenta (dziedziczenie), jednak tworząc oddzielne pliki dla każdej klasy i napotkałem pewien problem.

Tak wygląda klasa Punkt (Punkt.h oraz Punkt.cpp):

#pragma once
#include <iostream>

class Punkt
{
	std::string name;
	int x, y;
public:
	void wczytaj();
	void pokaz();
	Punkt(std::string n="Brak", int xx=0, int yy=0);
};
#include "Punkt.h"

void Punkt::wczytaj()
{
	std::cout << "Podaj nazwe punktu: ";
	std::cin >> name;
	std::cout << "Podaj wspolrzedna x punktu: ";
	std::cin >> x;
	std::cout << "Podaj wspolrzedna y punktu: ";
	std::cin >> y;
}

void Punkt::pokaz()
{
	std::cout << "Nazwa punktu: " << name << std::endl;
	std::cout << "Wspolrzedne punktu: (" << x << ", " << y << ")" << std::endl;
}

Punkt::Punkt(std::string n, int xx, int yy)
{
	name = n;
	x = xx;
	y = yy;
}

Dla Punktu wszystko działa jak powinno. Tworzę klasę Koło, która publicznie dziedziczy z klasy Punkt (Kolo.h oraz Kolo.cpp):

#pragma once
#include "Punkt.h"

class Kolo :
    public Punkt
{
    int r;
    std::string name;
public:
    void wczytaj();
    void pokaz();
    Kolo(std::string cn="Brak", std::string pn="Brak", int xx=0, int yy=0, int rr=1);
};
#include "Kolo.h"

void Kolo::wczytaj()
{
    Punkt::wczytaj();
    std::cout << "Podaj nazwe kola: ";
    std::cin >> name;
    std::cout << "Podaj promien kola: ";
    std::cin >> r;
}

void Kolo::pokaz()
{
    Punkt::pokaz();
    std::cout << "Nazwa kola: " << name << std::endl;
    std::cout << "Promien kola: " << r << std::endl;
}

Kolo::Kolo(std::string cn, std::string pn, int xx, int yy, int rr)
    :Punkt(pn, xx, yy)
{
    name = cn;
    r = rr;
}

Tutaj również wszystko w porządku. Mój problem zaczyna się jednak, gdy chcę stworzyć klasę Kula, która dziedziczy publicznie z klasy Koło:

#pragma once
#include "Kolo.h"

class Kula :
    public Kolo
{
    float v;
public:
    void wczytaj();
    void pokaz();
    Kula(std::string cn = "Brak", std::string pn = "Brak", int xx = 0, int yy = 0, int rr = 1, float vv = 1.0);
};
#include "Kula.h"

void Kula::wczytaj()
{
	Kolo::wczytaj();
	v = 4.0 / 3.0 * 3.14 * r * r * r;
}

void Kula::pokaz()
{
	Kolo::pokaz();
	std::cout << "Objetosc kuli stworzonej z obrotu podanego kola: " << v;
}

Kula::Kula(std::string cn, std::string pn, int xx, int yy, int rr, float vv)
	:Kolo(cn, pn, xx, yy, rr)
{
	v = vv;
}

Problem polega na tym, że nie mogę się dostać do żadnego atrybutu klasy Kula. Konkretnie, w tym przypadku - nie mogę dostać się do atrybutu r Kuli (promień) w funkcji void Kula::wczytaj(), ale próbowałem również z innymi atrybutami - to samo. Wszystkie atrybuty wpisywane w funkcjach z przestrzenią nazw Kula:: chcą "dobrać się" do atrybutów Koła, a nie Kuli (co pokazuje Visual Studio). Byłbym bardzo wdzięczny za jakąkolwiek wskazówkę.

3 odpowiedzi

0 głosów
odpowiedź 25 lipca 2020 przez j23 Mędrzec (194,920 p.)
wybrane 25 lipca 2020 przez maks0410
 
Najlepsza

Prywatne składowe klasy, pomimo że dziedziczone publicznie, są niedostępne klasom pochodnym. Jeśli chcesz mieć dostęp do pól klasy bazowej, ale nie chcesz ich upubliczniać, zrób je polami o dostępie chronionym (protected).

0 głosów
odpowiedź 25 lipca 2020 przez SimiVoid Pasjonat (19,790 p.)

Ciężko otrzymać dostęp do atrybutów, które nie są publiczne jak dziedziczysz tylko publiczne metody i atrybuty (pola). Domyślnie wszystkie elementy klasy są prywatne, więc musisz dać

public:

przed wszystkimi argumentami, a nie dopiero przed metodami.

0 głosów
odpowiedź 25 lipca 2020 przez maks0410 Początkujący (290 p.)

Ok, już zrozumiałem smiley

Myślałem, że dziedzicząc w pewien sposób tworzymy zupełnie nowe zmienny dla klasy dziedziczącej o tych samych nazwach, czyli np. r Kola "znika" i w klasie Kula mamy r Kuli. Jednak jest to tak jakby wciąż atrybut Kola, więc nie możemy się do niego dostać, jeśli był private (bo używamy go poza klasą Kolo). Dziękuję wszystkim za pomoc!

Podobne pytania

0 głosów
0 odpowiedzi 393 wizyt
pytanie zadane 11 listopada 2020 w C i C++ przez mikilorix1029 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,406 wizyt

92,568 zapytań

141,421 odpowiedzi

319,626 komentarzy

61,956 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...