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

inicjalizacja obiektu w innej klasie przez zmianę wartości pola klasy

Object Storage Arubacloud
0 głosów
520 wizyt
pytanie zadane 11 września 2018 w C i C++ przez niezalogowany
edycja 11 września 2018

chciałbym przez zmianę wartości pola "b" klasy p1 zmienić wartość obiektu "a" w klasie p1. i zmieniać dowolnie dla obiektu d w main() przez funkcję zmien_b. Dlaczego to jest niemożliwe?

#include <iostream>

using namespace std;
class p0
{
    int a0;
    int b0;

    public:
    p0 (int aa0=0, int bb0=5)
    {
       a0=aa0;
       b0=bb0;
    }
    void wypisz()
    {
        cout<<"a0= "<<a0<<endl;
        cout<<"b0= "<<b0<<endl;
    }

};

class p1
{

    int b=2;  

public:
    p1 ( int bb=7) { b=bb;}
    p0 a {(2+b),(5+b)} ; /// obiekt klasy p0 z inicjalizacją

    void zmien_b()
    {
        cout<<"podaj b";
        cin>>b;
    }
    void wy()
    {
        a.wypisz();
        cout<<"b= "<<b<<endl;
    }
};

int main()
{
    cout << "Hello world!" << endl;
    p1 d;
    d.wy();
    d.zmien_b();
    d.wy();

    p1 e(3);
    e.wy();
    return 0;
}

 

komentarz 11 września 2018 przez criss Mędrzec (172,590 p.)
edycja 12 września 2018 przez criss
p0 a {(2+b),(5+b)} ; /// obiekt klasy p0 z inicjalizacją

Nie, to nie jest obiekt klasy p0 z inicjalizacją. To jest funkcja składowa klasy p1 zwracająca typ p0. Ale w jej ciele nie ma return statement oraz brakuje średnika.. 

A twojego pytania kompletnie nie rozumiem, równie dobrze mógłbyś pisać po chińsku

class p1
{
 
    int b=2; 

Niepotrzebnie skoro przypisujesz wartość do b w domyślnym konstruktorze. 

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

Nie, to nie jest obiekt klasy p0 z inicjalizacją. To jest funkcja składowa klasy p1 zwracająca typ p0. Ale w jej ciele nie ma return statement oraz brakuje średnika.. 

Jesteś pewien? Dla mnie to normalna inicjalizacja. Gdyby to była deklaracja funkcji to nie zadziałałoby nizej:

a.wypisz();

a działa :P

komentarz 12 września 2018 przez criss Mędrzec (172,590 p.)
Wat. W życiu czegoś takiego nie widziałem. Ok, na razie usuwam.
komentarz 12 września 2018 przez mokrowski Mędrzec (155,460 p.)

@Crisshttps://en.cppreference.com/w/cpp/language/aggregate_initialization

Ale i tak kod nieczytelny. Aż tęsknię za językiem który uniemożliwi używanie nazw zmiennych jednoliterowych wszędzie poza indeksami w pętlach.

komentarz 12 września 2018 przez criss Mędrzec (172,590 p.)
Oj wiem co to aggregate initialization, ale nie wiedziałem, że można inicjalizować membery bezbośrednio w klasie bez znaku '='.
komentarz 12 września 2018 przez mokrowski Mędrzec (155,460 p.)

A czasem się przydaje nawet do POD'ów:

int value{}; // i jest zerem...

 

1 odpowiedź

0 głosów
odpowiedź 11 września 2018 przez RafalS VIP (122,820 p.)

Bo 

class p0
{
    int a0;
    int b0;

jest równoważne z:

class p0
{
private:
    int a0;
    int b0; 

Zrób z nich zmienne publiczne lub dopisz settery

Jeśli zmiana b ma pociągnąć ze sobą zmiane a to możesz w setterze składowej b modyfikować składową a. Sposób jest czysto teoretyczny, tak jak Twoja klasa. Takie rozwiązanie będzie miało sens tylko w bardzo specyficznych przypadkach. W ogólności wprowadzi sporo nieczytelności.

 

 

komentarz 12 września 2018 przez niezalogowany
edycja 12 września 2018

1) zmiana na publiczne p0 nie wiele pomaga jest to samo .

w woli wyjaśnienia klasa p0 w zamiarze pojemnikiem na punkt 2D i samego pojemnika nie ma sensu ustawiać.

2) klasa p1 jest zbiorem punktów(obiektów) zależnych od pól klasy p1 - tu jest tylko jedno "b" jako pole,

czyli inaczej każdy obiekt klasy p1 ma 2 współrzędne(a0,b0) opisane jakimś wzorem.

np. (a0=b*b, b0=b+b+b); drugi obiekt (a0=b*b*b+b, b=b+b+b+b) itd.

3)
 

int b=2; // jak tego niema to jakieś śmieci siedzą w "p0 a"




4) myślałem ze takim seterem jest właśnie


 void zmien_b()

    {     cout<<"podaj b";

       cin>>b;

    } 



5) jak zmienię konstruktor na
 

p1 ( int bb=7) :b(bb) { } ; 



to obiekt  p1 d(1000) w main()  zmieni mi pole poprawnie czyli  p0 a {(2+b),(5+b)} ={1002,1005};

komentarz 12 września 2018 przez RafalS VIP (122,820 p.)
1) gdyby ta klasa miała inną nazwe niż p0 to każdy by od razu zrozumiał

2) obliczanie wyrażeń matematycznych z zachowaniem kolejności operatorów nie jest takie proste: https://stackoverflow.com/questions/9329406/evaluating-arithmetic-expressions-from-string-in-c

3) nie dostarczyłeś domyślnego konstruktora, więc obiekt klasy p1 można stworzyć tylko przez konstruktor ustawiający wartość b, zatem nigdy nie będzie śmieci w b

4) setter nie pobiera danych z klawiatury tylko dostaje wartość w argumencie

5) nie rozumiem, czy to jest pytanie?
komentarz 12 września 2018 przez niezalogowany
Dyskusja jest fajna, ale ja nie jestem biegły w c++. Uczę się, ale z takim sobie skutkiem.

Mimo wszystko liczyłem bardziej na rybę niż wędkę.

A o co mi dokładnie chodzi

mam określony typ szafki (wysokość, szerokość, głębokość) która się składa z elementów

dla danego typ szafki zależność wymiarowa miedzy elementami jest stała.

I teraz chcę tworząc obiekt szafkę (100,wczytana z klawiatury, 50) wymiary elementów wysłać do pliku, następnie podać inną szerokość i znowu wysłać wymiary elementów  do pliku.

Czyli zamiast setera najlepiej jest zniszczyć obiekt i na to miejsce powołać inny z inną szerokością ?

Nie mogę wysłać elementów do setera bo jak będę miał 10 typów szafek, każda po 5 elementów opisanych zależnościami to muszę wysłać 50 równań do setera o nazwie zmień szerokość i np 50 równań do setera zmień głębokość.

konstruktor szafka (typ=domyślny , szerokość, głębokość=domyślna, wysokość = domyślna)

elementy składowe szafki interesują mnie dopiero w pliku wynikowym

czyli jak kupuję szafkę to interesują mnie generalnie jaki ma wymiary szafka, a nie wymiary elementów z których jest zbudowana
1
komentarz 12 września 2018 przez mokrowski Mędrzec (155,460 p.)
To dlaczego na miłość boską nie nazwiesz klas zgodnie z zastosowaniem czyli np. Szafka? Myślisz że mentalnie zrozumienie przy nazwie klasy Xyz pomoże w tym by każdy wiedział że chodzi Ci o samochód? A metoda r() w tej klasie ma przerzucać bieg na wyższy bo to skrzynia z formuły 1? Języki programowania służą do rozwiązywania problemów rzeczywistych a nie "przesłoniętych przez niezrozumiałe nazwy". Zakoduj to porządnie i wtedy pytaj. Osobiście jak widzę nazwy jedno/dwuliterowe elementów , kwalifikuję to jako bełkot... I nie tylko ja.

Miejże litość dla czytelnika.
komentarz 13 września 2018 przez RafalS VIP (122,820 p.)

mam określony typ szafki (wysokość, szerokość, głębokość) która się składa z elementów

o co chodzi z tymi elementami? 

Szafka ma 3 wymiary i kilka jakichś parametrów, które są zależne od wymiarów i masz na nie podany wzór np:

jakosc = x* y + z*x + z;

?

I generalnie jedyną funkcjonalnością Twojej klasy jest liczenie tych parametrów na podstawie wymiarów szafki i zapisanie ich do pliku?

Zrób klasyczny polimorfizm

class Szafka {
protected:
	int x, y, z;
public:
	Szafka(int x, int y, int z) : x(x), y(y), z(z) {}
	virtual double jakosc() = 0;
	virtual double poparcieDlaPis() = 0;
	...
};

class KrzywaSzafka : public Szafka {
public:
	virtual double jakosc() override {
		return x * y + 100;
	}
	virtual double poparcieDlaPis() override {
		return 0;
	}
};

class ProstaSzafka : public Szafka {
	...
};

 

komentarz 16 września 2018 przez niezalogowany
edycja 16 września 2018

To jeszcze nie ten poziom, na razie, napisałem tylko jeden program i to konsolowy, który mógłby się do czegoś przydać.

Dla mnie to tylko hobby po fizycznej harówce w dzień.

A z problemem poradziłem sobie tak

int main()
{
while (cin.good)
{
cout<<"podaj szerokosc:"

cin>>b;

p1 obiekt=new (b);
obiekt->pokaz_na_ekanie();

if(obiekt->fajna_podoba_mi_sie()) obiekt->wyslij_do_pliku();

delete obiekt;
}}

 

 

Podobne pytania

+1 głos
1 odpowiedź 1,961 wizyt
pytanie zadane 25 czerwca 2017 w C i C++ przez pimpek Użytkownik (680 p.)
0 głosów
1 odpowiedź 484 wizyt
pytanie zadane 21 lipca 2019 w C i C++ przez karol_2502 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 217 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

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

...