C++ wyświetlanie zmiennej private

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

C++ wyświetlanie zmiennej private

Post autor: patlas »

Witam ;)

Próbuje ostatnio swoich sił w c++ (znam dość dobrze C ale to nie wystarcza) :)
Moj problem polega na tym iż tworze sobie objekt klasy "moja" za pomocą konstruktora (który odrazu zmienia wartość zmiennej private: int liczba1). Teraz za pomocą funkcji klasy moja::pokaz chce wyświetlic wartość zmiennej liczba1 dla podanego objektu klasy jako argument :) (napewno zawile to opisuje więc oto kod: )

Kod: Zaznacz cały

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class moja
{
private:
	int liczba1;

public:
	void pokaz(moja & objekt); // <- co dać tutaj jako argument funkcji żeby móc dobrać się do zmiennej liczba1 dla konkretnego obiektu (który podany będzie jako argument)

	moja(int wartosc); // konstruktor zmieniający wartość zmiennej priwate na inną
};

moja::moja(int wartosc)
{
 liczba1 = wartosc;
}

void moja::pokaz(objekt) /// <- co trzeba zmienić rółniej w tym prototypie funkcji ??
{
 cout<< "wartość zmiennej private to:" <<objekt.liczba1<<endl;
}

int main(void)
{
 moja a(10); //tworzenie obiektu klasy moja  i przypisanie zmiennej liczba1 wartość 10 (konstruktor)
 pokaz(a);   //<- w tym miejscu chce jako artument funkcji wstawić obiekt klasy aby wyświetlić wartość zmiennej liczba1
 return 0;
}
Awatar użytkownika
JoeBuck
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 125
Rejestracja: 07 lip 2009, 12:06
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: JoeBuck »

Kod: Zaznacz cały

void pokaz(moja & objekt);
zamień na:

Kod: Zaznacz cały

void pokaz();
Potem

Kod: Zaznacz cały

void moja::pokaz(objekt) /// <- co trzeba zmienić rółniej w tym prototypie funkcji ??
{
 cout<< "wartość zmiennej private to:" <<objekt.liczba1<<endl;
}
Zamień na:

Kod: Zaznacz cały

void moja::pokaz()
{
 cout<< "wartość zmiennej private to:" <<liczba1<<endl;
}
A funkcję pokaz wywołaj tak:

Kod: Zaznacz cały

a.pokaz()
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: patlas »

Tylko że ja chciałbym przekazać objekt klasy jako argument funkcji :)
simonnam
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 104
Rejestracja: 03 sty 2007, 22:02
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: simonnam »

patlas pisze:Tylko że ja chciałbym przekazać objekt klasy jako argument funkcji :)
Ale po co? Jak chcesz poznać wartość liczba1, to po prostu wywołujesz funkcję

Kod: Zaznacz cały

nazwa_obietku.pokaz()
A jak już tak bardzo chcesz w programie (w main) funkcję wywołać jako

Kod: Zaznacz cały

pokaz(a)
to funkcja pokaz nie może być funkcją składową klasy, a np. funkcją globalną:

Kod: Zaznacz cały

void pokaz(moja & obiekt)
{
cout << "wartość zmiennej private to:" << obiekt.liczba1
}
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: patlas »

Tak tylko że zmienna liczba1 jest zmienną "PRIVATE" i w tym cały problem :(
Awatar użytkownika
Tares
Sędziwy Jeż
Sędziwy Jeż
Posty: 55
Rejestracja: 05 maja 2006, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: Tares »

Zmodyfikuj funkcję pokaz by wywoływała obiekt.pokaz() zamiast obiekt.liczba1 i powinno być tak jak chcesz.
^_^;
adrian5632
Przyjaciel
Przyjaciel
Posty: 259
Rejestracja: 17 gru 2006, 16:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: C++ wyświetlanie zmiennej private

Post autor: adrian5632 »

Ech... ale mu mieszacie...
Wystarczy, że dodasz modyfikator static w deklaracji metody pokaz - będzie ona wtedy niezależna od instancji (globalna dla całej klasy, a nie konkretnego obiektu). A w funkcji main wywołując tę metodę musisz poprzedzić ją nazwą klasy.
Tutaj działający kod:

Kod: Zaznacz cały

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class moja
{
private:
        int liczba1;

public:
        static void pokaz(moja & objekt);
        moja(int wartosc);
};

moja::moja(int wartosc)
{
 liczba1 = wartosc;
}

void moja::pokaz(moja &objekt) /// <- co trzeba zmienić rółniej w tym prototypie funkcji ?? - nic :P
{
 cout<< "wartość zmiennej private to:" <<objekt.liczba1<<endl;
}

int main(void)
{
 moja a(10); //tworzenie obiektu klasy moja  i przypisanie zmiennej liczba1 wartość 10 (konstruktor)
 moja::pokaz(a);   //<- w tym miejscu chce jako artument funkcji wstawić obiekt klasy aby wyświetlić wartość zmiennej liczba1
 return 0;
}

EDIT:
Napisał patlas Zobacz post
Tylko że ja chciałbym przekazać objekt klasy jako argument funkcji
Ale po co? Jak chcesz poznać wartość liczba1, to po prostu wywołujesz funkcję
A ty jak zaczynałeś zabawę z C++, to nie próbowałeś różnych rzeczy? Może kolega chce poćwiczyć i porobić doświadczenia? - Ja sam tak zaczynałem.

EDIT:
PS
Piszemy obiekt, a nie objekt ;P
[IMG]http://www.ubudsl.com/media/UbuDSL.png[/IMG]
Masz problem z UbuDSL? Nie zapomnij wygenerować i załączyć loga do postu!
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: patlas »

Dokładnie robie to tylko w celach naukowych (konkretnie nie potrzebuje pisać programów pod konsole bo do takowych wystarcza C :) ale niestety chce się bawić z interfejcem GUI w QT a tam trzeba C++ :) )

P.S Wiem że piszemy obiekt :) Napisałem objekt żeby wyróżniało się od reszty programu :)

Wszystkim wielkie dzięki za pomoc :)
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: el.pescado »

Ale po co? Jak chcesz poznać wartość liczba1, to po prostu wywołujesz funkcję
Jak chce argument to znaczy że chce argument. Może chce wywołać funkcję z trzema obiektami jako argumenty. Nie da się wywołać metody na rzecz trzech obiektów na raz.

Oto mój program:

Kod: Zaznacz cały

#include <iostream>

class A
{
	public:
		A (int a);

	private:
		int num;

	public:
		void display (A& a);
};


A::A (int a)
	: num(a)
{
}


void A::display (A& a)
{
	std::cout << "Mine: " << num << " Other: " << a.num << std::endl;
}


int main (int argc, char *argv[])
{
	A a(7);
	A b(8);

	a.display (b);

	return 0;
}
Na oko wygląda dokładnie tak samo, ale kompiluje się i działa:

Kod: Zaznacz cały

przemek@kfiatek:~$ g++ -Wall -o test test.cpp
przemek@kfiatek:~$ ./test 
Mine: 7 Other: 8
Może to jest kwestia kompilatora - u mnie jest GCC 4.1.3.

EDIT:
PS. Możesz też odwoływać się do pól prywatnych danej klasy w dowolnej funkcji (nawet metodzie innej klasy), pod warunkiem, że daną funkcję zaprzyjaźnisz z daną klasą. Poczytaj o słowie kluczowym friend.
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: C++ wyświetlanie zmiennej private

Post autor: mikolajs »

Ciekawy kod. Można sobie w metodzie A::display dowolnie modyfikować dane z innego obiektu. Czy to nie jest błąd kompilatora i czy nie narusza zasadę enkapsulacji?
adrian5632
Przyjaciel
Przyjaciel
Posty: 259
Rejestracja: 17 gru 2006, 16:07
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: C++ wyświetlanie zmiennej private

Post autor: adrian5632 »

mikolajs pisze:Ciekawy kod. Można sobie w metodzie A::display dowolnie modyfikować dane z innego obiektu. Czy to nie jest błąd kompilatora i czy nie narusza zasadę enkapsulacji?
Nie? Ponieważ metoda należy do klasy, więc może modyfikować jej zmienne, a statyczne mają to do siebie, że są niezależne od obiektu. To tak samo słowo kluczowe friend - też niby błąd? Nie, a niby 'narusza' wspomnianą zasadę.

// " Dokładnie, z tym że metoda A::display nie jest statyczna."
- Chodziło mi o poprawioną przeze mnie metodę pokaz ;P
[IMG]http://www.ubudsl.com/media/UbuDSL.png[/IMG]
Masz problem z UbuDSL? Nie zapomnij wygenerować i załączyć loga do postu!
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: C++ wyświetlanie zmiennej private

Post autor: el.pescado »

Dokładnie, z tym że metoda A::display nie jest statyczna.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości