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

Odpowiedz Nowy wątek
2015-07-28 13:39

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

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;
} 

Pozostało 580 znaków

x
2015-07-28 13:50
x
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;
}
edytowany 1x, ostatnio: Shalom, 2016-12-13 18:26

Pozostało 580 znaków

2015-07-28 13:54
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-07-28 14:02

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

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) {...}

Pozostało 580 znaków

2015-07-28 14:31

Rejestracja: 4 lata temu

Ostatnio: 1 rok temu

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".

Pozostało 580 znaków

2015-07-28 14:36

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

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.

edytowany 1x, ostatnio: twonek, 2015-07-28 14:37

Pozostało 580 znaków

Czarny Orzeł
2015-07-28 14:53
Czarny Orzeł
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.

Pozostało 580 znaków

fju
2015-07-28 18:30
fju
0

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

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

Pozostało 580 znaków

Czarny Orzeł
2015-07-28 19:22
Czarny Orzeł
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.

Post poprzednika usunąłem - cytat pozostawiam dla potomnych; - furious programming 2015-07-31 23:23

Pozostało 580 znaków

Wielki Krawiec
2015-07-29 15:00
Wielki Krawiec
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

Pozostało 580 znaków

2015-07-29 15:13

Rejestracja: 6 lat temu

Ostatnio: 3 godziny temu

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;
}

Pozostało 580 znaków

Odpowiedz

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