Strona 1 z 1

C++ wyświetlanie zmiennej private

: 14 sie 2009, 12:14
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;
}

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 12:35
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()

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 15:35
autor: patlas
Tylko że ja chciałbym przekazać objekt klasy jako argument funkcji :)

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 16:07
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
}

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 16:15
autor: patlas
Tak tylko że zmienna liczba1 jest zmienną "PRIVATE" i w tym cały problem :(

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 16:41
autor: Tares
Zmodyfikuj funkcję pokaz by wywoływała obiekt.pokaz() zamiast obiekt.liczba1 i powinno być tak jak chcesz.

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 17:12
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

Odp: C++ wyświetlanie zmiennej private

: 14 sie 2009, 21:38
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 :)

Odp: C++ wyświetlanie zmiennej private

: 15 sie 2009, 13:55
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.

Odp: C++ wyświetlanie zmiennej private

: 17 sie 2009, 17:30
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?

Odp: C++ wyświetlanie zmiennej private

: 17 sie 2009, 17:49
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

Odp: C++ wyświetlanie zmiennej private

: 17 sie 2009, 20:10
autor: el.pescado
Dokładnie, z tym że metoda A::display nie jest statyczna.