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

Zmienna reagująca na zmianę dwóch pozostałych

+1 głos
125 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
Cześć,
Pamiętam, że kiedyś, programując w C/C++ natrafiłem na sposób deklarowania zmiennej, dzięki któremu reagowała ona na zmiany dwóch pozostałych. Postaram się wyjaśnić lepiej przykładem:
Deklarowałem dwie zmienne np.
int x=1; int y=2;
Deklarowałem trzecią zmienną
int z=x+y;
Wypisywałem "z" i wychodziło "z=3"
Później mogłem wykonać dowolne operacje na "x" i "y" np. x++, y++, a przy wypisywaniu zmiennej "z", "aktualizowała" się ona sama, bez mojej ingerencji i przy wypisywaniu wychodziło "z=5". Kod wyglądał mniej więcej tak:
int x=1, y=2;
int z=x+y;
cout<<z<<endl; //z=3
x++; y++;
cout<<z<<endl; //z=5
Wiem, że mój zapis jest niepoprawny, i zmienna "z" nie będzie reagowała na zmiany "x" i "y", dopóki samodzielnie tego nie zrobię, ale pamiętam, że działając na wskaźnikach/referencjach udało mi się kiedyś uzyskać taki efekt. Mam nadzieję, że pamięć mnie nie myli zanadto i pomożecie mi w znalezieniu rozwiązania :)
komentarz 30 lipca 2018 przez Hiskiel Pasjonat (22,990 p.)
W sumie to teraz mindfucka dostałem, bo nic mi nie wiadomo, żeby wskaźnik mógł wskazywać na dwa adresy w pamięci, chyba, że jakiś offset czy coś. Swoją drogą ciekawy wątek.

5 odpowiedzi

+2 głosów
odpowiedź 30 lipca 2018 przez mokrowski VIP (109,840 p.)
Oprócz proponowanych rozwiązań, zerknij jeszcze do wzorca projektowego Observer. Na gołych wskaźnikach czy referencjach nie uzyskasz takiego efektu.
+1 głos
odpowiedź 30 lipca 2018 przez monika90 Pasjonat (23,620 p.)
edycja 30 lipca 2018 przez monika90

Nie da się tak w C++ "działając na wskaźnikach/referencjach", choć można sobie zrobić klasę, której obiekty wywołują podaną funkcję przy dostępie, np.:

#include <iostream>

template<class Func>
struct Ref
{
    Func f;
    Ref(Func f) : f(f) { }
    operator auto () const { return f(); }
};

int main()
{
    int x = 1;
    int y = 2;
    Ref z{[&]{ return x + y; }};
    std::cout << z << '\n';
    ++x;
    ++y;
    std::cout << z << '\n';
}

Ale nie róbcie tak jeśli nie rozumiecie jak to działa.

Ewentualnie można by użyć tu expression templates, tylko po co?

komentarz 30 lipca 2018 przez mokrowski VIP (109,840 p.)
Tylko jak zerwie referencję to będzie "jazda" :-/
komentarz 30 lipca 2018 przez monika90 Pasjonat (23,620 p.)
dopóki x i y istnieją można używać z
0 głosów
odpowiedź 30 lipca 2018 przez nikodemCuprys Początkujący (320 p.)
Spróbuj zapętlić aktualizowanie się zmiennej z np.

Int xNew,yNew;

xNew++;yNew++;

If(x!=xNew or y!=yNew)

{

x=xNew;

y=yNew;

z=x+y

}

ciut<<z<<endl;
0 głosów
odpowiedź 30 lipca 2018 przez Kurczak Użytkownik (940 p.)
To był o wiele prostszy zapis. Bez żadnych funkcji, tylko deklaracje zmiennych, być może poprzedzone jakimś słowem kluczowym. Dokładnie nie pamiętam, pamiętam jedynie, że byłem w szoku, że zmienna z reagowała na zmiany a i b.
–1 głos
odpowiedź 30 lipca 2018 przez profesorek96 Maniak (50,720 p.)

Bardzo ciekawy wątek. Ja próbowałem dostać się do tego za pomocą wskaźników na funkcje niestety marny skutek. Może jestem bliżej rozwiązania:

#include <iostream>
#include <cstdio>
using namespace std;
volatile int a=5;
volatile int b=6;
int dodawanie();

typedef int( * dzialanieT )();

int oblicz(dzialanieT pDzialanie );

int main()
{
	auto z=oblicz(dodawanie );
	printf( "Wynik dodawania = %d\n", z);
	a=12;
	b++;
	cout<<a<<" "<<b<<endl;
	z=oblicz(dodawanie );
	printf( "Wynik dodawania = %d\n", z);
	
    return 0;
}
int dodawanie()
{
	return a+b;
}
int oblicz( dzialanieT pDzialanie )
{
    return pDzialanie();
}

 

Podobne pytania

0 głosów
1 odpowiedź 53 wizyt
pytanie zadane 10 lipca 2015 w C i C++ przez Mkanobi Nowicjusz (200 p.)
0 głosów
1 odpowiedź 74 wizyt
0 głosów
2 odpowiedzi 119 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

65,658 zapytań

112,290 odpowiedzi

236,945 komentarzy

46,649 pasjonatów

Przeglądających: 252
Pasjonatów: 12 Gości: 240

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...