C++Niepożądane wywołanie konstruktora domyślnego

0

Witam mam problem jak w temacie. Polega on na tym że za każdym razem inicjowany jest konstruktor w klasie Colors to wywoływany jest za każdym razem konstruktor domyślny. Tak więc zamiast oczekiwanego przeze mnie wyniku, czyli przekazania z klasy Colors do klasy Rysunek zmiennych o wartościach a=205,a=1 i c=1 i wypisania ich na ekran, to program przekazuje te zmienne do klasy Rysunek ale ich wartości są takie jak konstruktorze domyślnym a=204, b=0, c=0. Teraz mam pytanie jak naprawić ten problem żeby przekazywane zmienne do klasy Rysunek miały wartości z funkcji ,,Colors::Colors( int kolor)'' a nie z konstruktora domyślnego? :)

 
#include <string.h>
#include<iostream>
#include <sstream>
#include <sstream>
#include <sstream>


 class  Colors
{
public:
	

	Colors( int kolor);

	
	  int a;
	 int b;
	  int c;
	 
	  
public:
	
 
  Colors(int f, int g, int h)
   {
	   
	   
	    this->a = f;
    this->b = g;
    this->c = h;
	
		
   }
 Colors() {
	
      a=204;
	   b=0;
	    c=0;	
    }
 ~Colors(){};
};
Colors::Colors( int kolor)
{
	
	switch(kolor )
		
{
case 1:
	
	
	
	a=205;
	b=1;
	c=1;
	
	std::cout << "kolor o zmiennej  " <<a<<"  "<<b<<" "<<c;
	 Colors( a,  b,  c);

    break;

default:


    
	std::cout << "nie rób nic" <<endl;

    break;
}	
}

class Rysunek :  public Colors
{
void draw( void );
public:Rysunek(int a,int b,int c) : Colors(a,b,c) {}


};
void Rysunek::draw( void )
{
	  
	
cout<<"zmienne:"<<a<<" ,"<<b<<" ,"<<c<<endl;
}



int main()
{
	 int kolor=1;

Colors jakis(kolor);

Rysunek draw(void);


return 0;
} 






0
#include<iostream>

using namespace std;
 
class  Colors {
public:
    Colors( int kolor);
 
     int a;
     int b;
     int c;
 
  Colors(int f, int g, int h) {
    this->a = f;
    this->b = g;
    this->c = h;
   }
   
 Colors() {
      a=204;
      b=0;
      c=0;    
 }
 ~Colors(){};
};
Colors::Colors( int kolor) {
    switch(kolor) {
case 1:
    a=205;
    b=1;
    c=1;
 
    std::cout << "kolor o zmiennej  " <<a<<"  "<<b<<" "<<c;
     Colors( a,  b,  c);
 
    break;
 
default:
    std::cout << "nie rób nic" <<endl;

    break;
   }    
}
 
class Rysunek :  public Colors
{
void draw( void );
public:Rysunek(int a,int b,int c) : Colors(a,b,c) {}
 
 
};
void Rysunek::draw( void )
{
 
 
cout<<"zmienne:"<<a<<" ,"<<b<<" ,"<<c<<endl;
}
 
 
 
int main()
{
     int kolor=1;
 
Colors jakis(kolor);
 
Rysunek draw(void);
 
 
return 0;
}
0

To co napisałeś nie ma sensu. Rysunek NIE JEST KOLOREM więc dziedziczenie jest tu błędem.
Poza tym ten kode w ogóle nie robi tego co ci się wydaje. To: Rysunek draw(void); wcale nie wywołuje twojej metody draw.

1

Z WTF-ów:

  1. Wcięcia. Polecam: http://format.krzaq.cc/
  2. Po co wiele razy pisać public: i #include <sstream>?
  3. Jeśli C++ to #include <cstring>
  4. Rysunek draw(void) deklaruje nową funkcję o nazwie draw, która zwraca obiekt typu Rysunek

Wracając do głównego pytania:
Nigdzie nie jest wywołany konstruktor domyślny. Nie wiem skąd sobie takie wnioski bierzesz.

a = 205;
b = 1;
c = 1;

Ustawiłeś już zmienne, to po co chcesz jeszcze wywołać inny konstruktor?

Colors(a, b, c);

Poza tym tworzysz tutaj nowy nienazwany obiekt za pomocą konstruktora 3-argumentowego, który nijak się ma do obiektu, na którym operujesz. Składnia delegacji konstruktorów jest inna, bardziej w stylu

Colors(int kolor) : Colors(a, b, c) {...}
0

Ogólnie pracuje nad projektem na studia, jest to co prawda skrócona wersja tego kodu, bo w założeniu jak klikam przycisk czerwony to w tym przycisku kolor ustawia się na 1, a potem case sobie ustawiam zmienne a,b,c odpowiedzialne za RGB. Dlatego też tutaj zawędrowałem ponieważ mimo że program do case mi wchodzi to nadal mimo ustawienia zmiennych, cały czas jest wywoływany konstruktor tak że jeżeli tego nie ustawie nie będę mógł przekazać kolorów RGB w przypadku żółtego czy zielonego przycisku a jest mi to potrzebne do rysowania linii i innych figur geometrycznych. Dodałem Colors(int kolor) : Colors(a, b, c) {a=205;b=1;c=1;}" do funkcji Colors::Colors( int kolor)''.Wyskoczył mi błąd ,,type name is not allowed".

0

Niewiele zrozumiałem z tego opisu i w sumie jest mi on zbędny. Mówisz, że wywołuje się konstruktor bezparametrowy. Mówię, że to nieprawda. Błąd masz gdzie indziej.

Dodałem Colors(int kolor) : Colors(a, b, c)
Po co? I tak w ciele konstruktora ustawiasz te zmienne.

1
  1. To nie są mistrzostwa w pisaniu najbrzydszego kodu, który działa (chociaż nie tak jak zamierzałeś).
  2. Błędów jest tyle i tak banalnych, że najlepiej będzie, jeżeli weźmiesz do ręki jakąś książkę/otworzysz ebooka o C++ i przejrzysz rozdział o klasach. Nie bierz się za dziedziczenie, a nawet definiowanie prostych klas, jeżeli nie wiesz nawet jak korzystać z ich interfejsu.

Bynajmniej nie piszę tego ze złośliwości.

0

Colors(int f, int g, int h) {
this->a = f;
this->b = g;
this->c = h;
}

a cóż to z bzdety... :)

0
fju napisał(a):

Może lepiej pisz tak:
Colors(int f, int g, int h) {
that->a = f;
that->b = g;
that->c = h;
}

Większość kodu to bzdety. Mimo wszystko jego wersja była przynajmniej poprawna, w sensie działająca. Ty natomiast już jedynie prześmiewczo rzeźbisz. Kolega oczekuje pomocy, a nie piętnowania błędów.
Chcesz się pośmiać to pokaż swój kod.

0

Dobra macie racje kod amatorski wręcz śmieszny, ale dopiero się uczę więc naprawdę prosiłbym czy mógłby mi ktoś pokazać przykład w którym odwołujemy się do zmiennej w main z klasy bazowej i nadajemy jej wartość, a następnie klasa pochodna dziedziczy po klasie bazowej tą zmienną. Prosiłbym jeszcze raz o przykład jakiś prosty, wręcz banalny a nie rzucanie linkami bo szukałem i nic wartościowego na ten temat nie znalazłem :p

0

Nie kłam.

#include <iostream>
using namespace std;

class Zwierzak
{
protected:	
	double waga;
	
public:
	Zwierzak(double waga) :
		waga(waga)
	{}
	virtual ~Zwierzak() {}
};

class ZwierzakLatajacy : public Zwierzak
{
public:
	ZwierzakLatajacy(double waga) :
		Zwierzak(waga)
	{}
	~ZwierzakLatajacy() {}

};

int main() {
	double wagaZwierzaka = 100;
	
	ZwierzakLatajacy zwierzakLatajacy(wagaZwierzaka);
	return 0;
}
0
Wielki Krawiec napisał(a):

Dobra macie racje kod amatorski wręcz śmieszny, ale dopiero się uczę więc naprawdę prosiłbym czy mógłby mi ktoś pokazać przykład w którym odwołujemy się do zmiennej w main z klasy bazowej i nadajemy jej wartość, a następnie klasa pochodna dziedziczy po klasie bazowej tą zmienną. Prosiłbym jeszcze raz o przykład jakiś prosty, wręcz banalny a nie rzucanie linkami bo szukałem i nic wartościowego na ten temat nie znalazłem :p

Wyżej masz przykład, ale już teraz wiem co Ci odpowiedzieć:

Jak tworzysz klasę bazową i pochodną, to dziedziczysz strukturę. Ty chcesz utworzyć bazową i nadać jednej zmiennej wartość i CHCESZ, żeby ta wartość była odziedziczona. To nie tak działa.

0
xfin napisał(a):

Ty chcesz utworzyć bazową i nadać jednej zmiennej wartość i CHCESZ, żeby ta wartość była odziedziczona. To nie tak działa.

Mógłby zrobić statyczną zmienną w bazowej w sumie

0

jeśli tworzysz nowy obiekt klasy pochodnej to NIE MOŻESZ poprzez dziedziczenie dostać dostęp do wartości zmiennej z klasy bazowej... chyba, że jest statyczna ale jeśli nie to możesz co najwyżej podawać do konstruktora obiekt klasy bazowej i z niego brać wartości i też będzie działać

0

Witam dziękuje za wszelką udzieloną pomoc na tym forum, dużo mi pomogliście ;) Przykład, przykład ze zwierzętami idealnie rozjaśnił mi sytuację i faktycznie wystarczyło stworzyć w klasie pochodnej konstruktor a następnie go wywołać :)

0

Drobna uwaga - natury ogólniej.

Programowanie nie polega na robieniu jakichś tam konstruktorów, dziedziczeniu czegoś tam, ani na definiowaniu prześwietnych operatorów.

Zatem na czym to polega?

Ano na tym żeby to ostatecznie działało tak jak powinno.

1 użytkowników online, w tym zalogowanych: 0, gości: 1