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

Klasa, konstruktor i funkcje

Object Storage Arubacloud
0 głosów
220 wizyt
pytanie zadane 8 września 2018 w C i C++ przez DuduśToJa Początkujący (290 p.)
#include "pch.h"
#include <iostream>

using namespace std;

class Klasa
{
private:

	int raz;
	int dwa;
	int trzy;

public:

	Klasa(int r, int d, int t)
	{
		raz = r;
		dwa = d;
		trzy = t;
	}
	
};


void qwerty()
{
	Klasa k1(1, 2, 3);

	cout << r;

}

int main()
{
	qwerty();

	
}

Witam. Mam problem z takim kodem. Nie wiem za bardzo jak to zrobić, żeby wypisać wartość zmiennej raz, domyślam się, że w funkcji qwerty() powinien użyć jakiś argumentów. Czy jest ktoś w stanie przekształcić ten kod,  aby wypisały się na ekranie wartości zmiennych raz, dwa, trzy? :) :)

3 odpowiedzi

+1 głos
odpowiedź 8 września 2018 przez RafalS VIP (122,820 p.)
edycja 8 września 2018 przez RafalS

Z obecną klasą Klasa nie za bardzo możesz współpracować, bo zmienne są prywatne. Możesz wykorzystać fakt, że Twoja klasa ze względu na swoją prostote należy do typu plain old data POD, czyli jej obiekty w pamięci składają się z samych  składowych ułożonych w kolejności zdeklarowania w klasie. To oznacza, że można w bardzo BRZYDKI sposób dobrać się do jej składowych mimo, że sa prywatne. Dodatkowo wiemy, że wszystkie składowe są typu int, więc można ją potraktować jak tablicę, która właśnie tym jest: zmiennymi tego samego typu ułożonymi jedna po drugiej w pamięci (oczywiście po odpowiednim zrzutowaniu):

void qwerty()
{
	Klasa k1(1, 2, 3);

	int* hacky_int_getter = reinterpret_cast<int*>(&k1);
	for (size_t i = 0; i < 3; i++)
	{
		cout << hacky_int_getter[i] << endl;
	}
}

Gdyby wszystkie składowe nie były tego samego typu to musiałbyś w trakcie zmieniać typ wskaźnika (rzutować), żeby operator ++ wiedział o ile bajtów przesunąć się w pamięci a cout zeby wiedzial jak wypisac te bajty.

A tak serio to dodaj metody zwracające wartości składowych tzw gettery:

class Klasa
{
private:

	int raz;
	int dwa;
	int trzy;

public:

	Klasa(int r, int d, int t)
	{
		raz = r;
		dwa = d;
		trzy = t;
	}

	int getRaz() {
		return raz;
	}

	int getDwa() {
		return dwa;
	}

	int getTrzy() {
		return trzy;
	}

};

wtedy zeby dostać wartość składowej klasy po prostu wywołujesz na jej obiekcie getRaz() czy tam getDwa(). getSkladowa to oczywiście konwencja programistyczna. Te metody mogą mieć dowolną nazwe, ale wtedy kod traci czytelność.

Mógłbyś zmienić private na public i dobierać się do tych składowych normalnie, ale wtedy każdy może te zmienne zmodyfikować - jest to zła praktyka.

PS Dla ciekawskich - gettery i settery w idealnym świecie w programowaniu obiektowym nie powinny występować, ale Ty się na razie tym nie przejmuj, a świat nie jest idealny :P

komentarz 8 września 2018 przez DuduśToJa Początkujący (290 p.)

Te gettery nie działają:

class Klasa
{
private:

	int raz;
	int dwa;
	int trzy;

public:

	Klasa(int r, int d, int t)
	{
		raz = r;
		dwa = d;
		trzy = t;
	}

	int getRaz() {
		return raz;
	}

	int getDwa() {
		return dwa;
	}

	int getTrzy() {
		return trzy;
	}

};


void qwerty()
{
	Klasa k1(1, 2, 3);

	cout << k1.raz;

}

int main()
{
	qwerty();


}

Ale działa to:

class Klasa
{
public:

	int raz;
	int dwa;
	int trzy;

public:

	Klasa(int r, int d, int t)
	{
		raz = r;
		dwa = d;
		trzy = t;
	}

	int Raz()
	{
		return raz;
	}

	int Dwa()
	{
		return dwa;
	}

	int Trzy()
	{
		return trzy;
	}
};


void qwerty()
{
	Klasa k1(1, 2, 3);

	cout << k1.raz;
}

int main()
{
	qwerty();


}

 

komentarz 8 września 2018 przez monika90 Pasjonat (22,940 p.)

@RafalS,

Przesunięcie wskaźnika jest legalne tylko w przypadku tablic, tu nie ma tablicy.

komentarz 8 września 2018 przez RafalS VIP (122,820 p.)

Bo musisz je wywolac tak jak kazda inna metode obiektu:

Klasa k1(1,2,3);
cout<< k1.getRaz(); // wypisanie skladowej raz

 

komentarz 8 września 2018 przez RafalS VIP (122,820 p.)
@monika90 tak czulem :D. Wiec nie ma pewnosci ze zadziala ale najprawdopodobniej tak. Przynajmniej na MSVC17 :p
komentarz 8 września 2018 przez DuduśToJa Początkujący (290 p.)
No faktycznie, dzięki :)
+1 głos
odpowiedź 8 września 2018 przez skankhunt42 Obywatel (1,170 p.)
W funkcji qwerty() próbujesz wypisać w konsoli wartość zmiennej r. Problem w tym że zmienna r to tylko argument wewnątrz konstruktora klasy.

Żeby wypisać wartość zmiennych raz dwa i trzy musisz zmienić je na atrybuty publiczne, lub skorzystać z publicznej metody wewnątrz klasy która zwróci wartość prywatnych zmiennych.

Pamiętaj o tym że jeśli chcesz wypisać wartość zmiennej lub metody należącej do obiekty k1 to musisz skorzystać z zapisu cout<<k1.raz; a nie cout<<raz;
komentarz 8 września 2018 przez DuduśToJa Początkujący (290 p.)

Dodałem do klasy te metody i teraz działa

        int Raz()
	{
		return raz;
	}

	int Dwa()
	{
		return dwa;
	}

	int Trzy()
	{
		return trzy;
	}

 

–1 głos
odpowiedź 8 września 2018 przez profesorek96 Szeryf (91,420 p.)
Co to jest zamienia z 30 linijki ? Żeby ci się wypisywała klasa jak np. napiszesz tak ciut<<k1; i ci się to wszystko wypisze co jest w tej klasie tzn pola to musisz przeciążyć operator <<

Podobne pytania

0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 12 grudnia 2015 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
0 odpowiedzi 102 wizyt
pytanie zadane 5 stycznia 2023 w C i C++ przez dextermorgan Nowicjusz (120 p.)
–1 głos
1 odpowiedź 807 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 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!

...