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

Konstruktory

Object Storage Arubacloud
0 głosów
147 wizyt
pytanie zadane 6 maja 2020 w C i C++ przez persikk Obywatel (1,140 p.)

Witam,

Sytuacja jest taka

class A
{

int a;
public:
A(int x=0)
{   
a=x;
}


};

I teraz pytanie. 

Mogę stworzyć obiekt tak

A a1(3);

Ale jeśli chce stworzyć 

A a1;
// lub
A a2();

To wyskakuje mi błąd, dla konstruktora niby na starcie przypisuje wartość domyślną 0 więc nie bardzo wiem dlaczego mi to nie przechodzi. Wykładowca kazał dopisać x=0, co dopisałem ale wydaje mi się że kompletnie nic to nie daje. Bo teorytycznie miało to być po to aby przy inicjalizacji obiektu jak ktoś nie podał parametrów to automatycznie wrzuca tam 0. 

Konstruktor ma parametr więc teorytycznie powinienem go tam podać. Ale w takim razie po co te zero ?

I teraz pytanie czy ja o czymś nie wiem czy źle zrozumiałem bądź źle mi to wytłumaczono.

Mogę dopisać kolejne konstruktory, ale czy da się to zrobić przy pomocy tego jednego ?

1 odpowiedź

0 głosów
odpowiedź 6 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
#include <iostream>
using namespace std;

class A
{
    int a;
public:
    A(int x) : a(x) {};
    A () : a(2) {};
    inline int getA () const {
        return a;
    }


};
int main() {

    A a1;
    std::cout << a1.getA();
}

Co do samego pytania, czy moze byc wiecej konstruktorow. Tak moesz ich stworzyc ile chcesz. Co do wywoalania, widzisz jak ja je wykonalem u siebie. Ale Twoj kod tez jest okay, tylko stworz obiekt bez (), czyli:

A a1;

i tyle. () jest zbedne, bo mowisz tak czy siak, wywolaja konstruktor podstawowy

komentarz 6 maja 2020 przez persikk Obywatel (1,140 p.)
Wiem że można zrobić więcej konstruktorów

Chodziło mi głównie o to że w konstruktorze z jednym parametrem dopisujemy int x=0

I do czego ma służyć to x=0 ?

Bo z moich prób wychodzi że to jest do niczego nie potrzebne taka zapchaj dzuira.

I chciałbym się dowiedzieć po prostu czy ja gdzieś robię błąd, czy chce wykonać coś niemożliwego ;/

 

I się trochę irytuję, ehh ale ten wykładowca cały czas się doprecyzować nie umie i takie kwiatki wychodzą.
komentarz 6 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
Jak do nieczego nie sluzy? Ustawia wartosc a na 0 i tyle. Usun podstawowy konstruktor (defaultowy) i wtedy wywolaj jezszce raz funkcje getA i zobazysz losowa wartosc.

BTW

nie musisz pdac parametru, bo po co skoro i tak nadales mu juz wartosc. Chyba nie ma sensu robienia 2 razy tego samego. JEzeli chcesz zeby przyjac dowolna wartosc, to zobacz na mmoj 1 konstruktor
komentarz 6 maja 2020 przez tkz Nałogowiec (42,000 p.)

Argument domyślny, bo tak się nazywa to x = 0. Służy temu byś nie musiał go podawać przy tworzeniu. 

#include <iostream>

class A
{
    int a;
  public:
  A(int x = 432)
  {
      a = x;
  }
  int getA()
  {
      return a;
  }
};
int main()
{
    A a(1);
    std::cout<<a.getA()<<'\n';
    A a1;
    std::cout<<a1.getA()<<'\n';
}

 

komentarz 6 maja 2020 przez persikk Obywatel (1,140 p.)

No właśnie tak w teori powinno być.

 

include <iostream>
using namespace std;

class Zespolona
{
    int re;
    int im;
public:

    Zespolona(int,int);

};

//Definiuje w pliku potem to tak

Zespolona::Zespolona(int x=0, int y=0)
{
    re=x;
    im=y;

}

// i w mainie mam to i wypluwa mi błąd 

Zespolona z1(2,2);
Zespolona z2; // w tym miejscu wyskakuje mi błąd

z1.show();
z2.show(); 

 

komentarz 6 maja 2020 przez tkz Nałogowiec (42,000 p.)
Pokaż cały kod. I jaki to błąd?
komentarz 6 maja 2020 przez persikk Obywatel (1,140 p.)

Ogólnie ciekawa sprawa po przepisaniu do nowego pliku tylko tego kawałka co pokazywałem na forum wszystko mi przeszło.

 

Plik main

#include <iostream>
#include "zad_2.h"
#include "zad_3.h"
using namespace std;


int main()
{

//zad 3



//zad 2
Zespolona z1(2,2);
Zespolona z2; // tutaj sypie błędem

z1.show();
z2.show();

cin>>z2;
Zespolona z3=z1-z2;
z3.show();

Zespolona z4=z1*z3;
z4.show();

Zespolona *tab=new Zespolona[5];
for(int i=0;i<5;i++)
{
cin>>tab[i];
}
znajdzMax(tab,5);





    return 0;
}

 

Plik .h

#include <iostream>
using namespace std;

class Zespolona
{
    int re;
    int im;
public:

    Zespolona(int x=0, int y=0);
    Zespolona();
    void show();
    Zespolona operator-(Zespolona z2);
    Zespolona operator*(Zespolona z2);
    Zespolona operator>(Zespolona z2);

    friend istream & operator>>(istream & klawiatura, Zespolona &licz);

    friend void znajdzMax(Zespolona tab[],int rozmiar);



};

plik .cpp

#include <iostream>
#include "zad_2.h"
#include <cmath>
using namespace std;



Zespolona::Zespolona(int x=0, int y=0)
{
    re=x;
    im=y;

}


void Zespolona::show()
{
    cout<<re<<" + "<<im<<"i"<<endl;

}
// Przeci¹¿one operatory
Zespolona Zespolona::operator-(Zespolona z2)
{
    re=re-z2.re;
    im=im-z2.im;
    return *this;

}

Zespolona Zespolona::operator*(Zespolona z2)
{
    re=re*z2.re;
    im=im*z2.im;
    return *this;
}

Zespolona Zespolona::operator>(Zespolona z2)
{
    if(im>z2.im) cout<<"true"<<endl;
    else cout<<"false"<<endl;

}



istream & operator>>(istream & klawiatura, Zespolona &licz)
{
    klawiatura>>licz.re;
    klawiatura>>licz.im;
    return klawiatura;
}

void znajdzMax(Zespolona tab[],int rozmiar)
{
    float max=sqrt(pow(tab[0].re,2)+pow(tab[0].im,2));\
    int obiekt=0;

    for(int i=1; i<rozmiar;i++)
    {
        float max2=sqrt(pow(tab[i].re,2)+pow(tab[i].im,2));
        if(max<max2)
        {
            max=max2;
            obiekt=i;
        }
    }
        cout<<"Najwienkszy modul jest dla tab["<<obiekt<<"]"<<endl;
}

 

komentarz 6 maja 2020 przez persikk Obywatel (1,140 p.)
W pliku .h została mi deklaracja konstruktora bez parametrowego zapomniałem go usunąć.

Ale po usunięcia dalej to samo nie przechodzi mi, dalej w tym samym miejscu się wykłada
1
komentarz 6 maja 2020 przez tkz Nałogowiec (42,000 p.)

#include <iostream>
using namespace std;
 #include <cmath>
class Zespolona
{
    int re;
    int im;
public:
 
    Zespolona(int x=0, int y=0);
    void show();
    Zespolona operator-(Zespolona z2);
    Zespolona operator*(Zespolona z2);
    Zespolona operator>(Zespolona z2);
 
    friend istream & operator>>(istream & klawiatura, Zespolona &licz);
 
    friend void znajdzMax(Zespolona tab[],int rozmiar);
 
 
 
};

 
Zespolona::Zespolona(int x, int y)
{
    re=x;
    im=y;
 
}
 
 
void Zespolona::show()
{
    cout<<re<<" + "<<im<<"i"<<endl;
 
}
// Przeci¹¿one operatory
Zespolona Zespolona::operator-(Zespolona z2)
{
    re=re-z2.re;
    im=im-z2.im;
    return *this;
 
}
 
Zespolona Zespolona::operator*(Zespolona z2)
{
    re=re*z2.re;
    im=im*z2.im;
    return *this;
}
 
Zespolona Zespolona::operator>(Zespolona z2)
{
    if(im>z2.im) cout<<"true"<<endl;
    else cout<<"false"<<endl;
 
}
 
 
 
istream & operator>>(istream & klawiatura, Zespolona &licz)
{
    klawiatura>>licz.re;
    klawiatura>>licz.im;
    return klawiatura;
}
 
void znajdzMax(Zespolona tab[],int rozmiar)
{
    float max=sqrt(pow(tab[0].re,2)+pow(tab[0].im,2));\
    int obiekt=0;
 
    for(int i=1; i<rozmiar;i++)
    {
        float max2=sqrt(pow(tab[i].re,2)+pow(tab[i].im,2));
        if(max<max2)
        {
            max=max2;
            obiekt=i;
        }
    }
        cout<<"Najwienkszy modul jest dla tab["<<obiekt<<"]"<<endl;
}


#include <cmath>

using namespace std;
 
 
int main()
{
 
//zad 3
 
 
 
//zad 2
Zespolona z1(2,2);
Zespolona z2; // tutaj sypie błędem
 
z1.show();
z2.show();
 
cin>>z2;
Zespolona z3=z1-z2;
z3.show();
 
Zespolona z4=z1*z3;
z4.show();
 
Zespolona *tab=new Zespolona[5];
for(int i=0;i<5;i++)
{
cin>>tab[i];
}
znajdzMax(tab,5);
 
 
 
 
 
    return 0;
}

Rozdziel tylko, ale działa. 

komentarz 6 maja 2020 przez persikk Obywatel (1,140 p.)
Dzięki i teraz już widzę gdzie leży błąd, taka drobnostka a tyle czasu poszło...

 

Nie jestem pewny czy nie mieszam  deklaracji i definicji więc mogę pomieszać te dwa wyrazy.

Ale ogólnie przy definicji funkcji w pliku .h należało nadać wartość początkową dla x i y,

A przy pisaniu deklaracji(ciała funkcji) w .cpp nie dodawać już zapisu x=0, y=0.

 

Dziękuje ślicznie za pomoc !
komentarz 6 maja 2020 przez j23 Mędrzec (194,920 p.)

@DragonCoder, to inline przy metodzie, która jest zdefiniowana we wnętrzu definicji klasy, jest zbędne - takie metody inline'owane są domyślnie.

Podobne pytania

0 głosów
2 odpowiedzi 476 wizyt
0 głosów
1 odpowiedź 400 wizyt
pytanie zadane 12 marca 2019 w C i C++ przez Curiosis Użytkownik (540 p.)
+2 głosów
3 odpowiedzi 488 wizyt
pytanie zadane 16 kwietnia 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,596 zapytań

141,445 odpowiedzi

319,717 komentarzy

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

...