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

Klasa, konstruktor i funkcje

VPS Starter Arubacloud
0 głosów
254 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ź 424 wizyt
pytanie zadane 12 grudnia 2015 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
0 odpowiedzi 110 wizyt
pytanie zadane 5 stycznia 2023 w C i C++ przez dextermorgan Nowicjusz (120 p.)
–1 głos
1 odpowiedź 822 wizyt

92,843 zapytań

141,782 odpowiedzi

320,858 komentarzy

62,174 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...