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

pusty konstruktor

Object Storage Arubacloud
0 głosów
212 wizyt
pytanie zadane 18 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
class Result
{
    public:
    void menu(Wx w, Px p);
};

Jak widac klasa nie ma zadnych atrybutow, jak powinien wygladac do niej konstruktor?

Bo majac tak:

Result::Result()
Result::~Result()

dostaje error:

 kopia\structors.cpp|37|error: expected initializer before 'Result'|

Drugie pytanie to dlaczego nie majac zdeklarowanej przyjazni w klasie Px (jest w Wx a Px dziedziczy od Wx) moge uzyskac dostep do Px::degree w funkcji menu skoro przyjazn nie jest dziedziczona? Kody:

polynomials.h:

#include <iostream>

using namespace std;

class Polynomial
{
public:
    virtual void gather()=0;
    virtual void show()=0;
};

class Px;
class Wx;

class Result
{
    public:
    void menu(Wx w, Px p);
};

class Wx :public Polynomial
{
protected:
    string degreeStringNum;
    int degree;
    int helper;
    float *coefficients;

public:
    virtual void gather();
    virtual void show();
    void isInteger(string &s, int &i);
    friend void Result::menu(Wx w, Px p);

    Wx(string="0", int=0, int=0);
    ~Wx();

};

class Px :public Wx
{
public:

    virtual void gather();
    virtual void show();
    
    Px(string="0", int=0, int=0);
    ~Px();
};

structors.cpp:

#include <iostream>
#include "polynomials.h"

using namespace std;

Wx::Wx(string dNS, int d, int h)
{
    degreeStringNum=dNS;
    degree=d;
    helper=h;
    coefficients=new float[d+1];
    cout<<"constructor 1 called";
    cout<<endl;
}
Wx::~Wx()
{
    delete [] coefficients;
    cout<<"destructor 1 called";
    cout<<endl;
}

Px::Px(string dNS, int d, int h)
:Wx(dNS, d, h)
{
    coefficients=new float[d+1];
    cout<<"constructor 2 called";
    cout<<endl;
}
Px::~Px()
{
    delete [] coefficients;
    cout<<"destructor 2 called";
    cout<<endl;
}

//Result::Result()
//Result::~Result()

menu.cpp

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

void Result::menu(Wx w, Px p)
{
    cout<<p.degree;
    cout<<endl;
}

main.cpp:


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

int main()
{
    Wx w;
    Px p;
    Result r;

    Polynomial *pointerWx;
    Polynomial *pointerPx;
    pointerWx=&w;
    pointerPx=&p;
    pointerWx->gather();
    pointerWx->show();
    pointerPx->gather();
    pointerPx->show();
    r.menu(w, p);
}

No i trzecie pytanie to dlaczego z tego jest taki output: 

constructor 1 called
constructor 1 called
constructor 2 called
Input degree of polynomial W(x): 3
Input coefficients and constant of polynomial W(x):
1
2
3
4
W(x)= x3+2x2+3x+4

Input degree of polynomial P(x): 2
Input coefficients and constant of polynomial P(x):
9
8
7
P(x)= 9x2+8x+7

2
destructor 1 called
destructor 2 called
destructor 1 called
destructor 2 called
destructor 1 called
destructor 1 called

mam na mysli te destruktory, cos ich za duzo :p, te liczby oraz napisy "Input degree and constant..." itp to zasluga innych funkcji w moim programie ale nie sa one kluczowe tutaj. Skąd się wziely te destruktory, przed dodaniem klasy Result oraz zaprzyjaznienia jej funkcji z klasami Px i Wx bylo tylko tak z tego co pamietam:

destructor 2 called
destructor 1 called 
destructor 1 called

 

1 odpowiedź

+1 głos
odpowiedź 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

1.

class Result
{
public:
    Result() {} 
};

Chociaż jeśli ten konstruktor nic nie robi, to nie trzeba go w ogóle definiować.

2. Result::menu jest zaprzyjaźniona z klasą Wx, zatem ma dostęp.

3. w menu parametry przekazujesz przez wartość, czyli tworzone są kopie obiektów, które niszczone są po wyjściu z metody.

komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
2)tak ale z Px już nie a czytałem że przyjaźń nie jest dziedziczona, więc stąd jestem zdezorientowany

3)czyli tak ma być? Nic złego nie jest że tyle tych destruktorow? I w sumie konstruktorów jest pewnie tyle samo tylko że mi się nie wyświetlają czy jak to jest dokładnie?
1
komentarz 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

2. nie jest dziedziczona w tym znaczeniu, że przyjaźń z klasą bazową nie oznacza przyjaźni z klasą pochodną, ergo - funkcja ma dostęp do składowych klasy Wx, ale nie ma do tych z Px.

3. zrób przekazywanie przez referencję to będziesz wiedział.

komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)

funkcja ma dostęp do składowych klasy Wx, ale nie ma do tych z Px.

Nie czaje chyba

cout<<p.degree;

Ten zapis to wyświetlenie Px::degree (czy nie?) A powinienem nie mieć do niego dostepu

1
komentarz 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

No a gdzie jest zdefiniowane pole degree? W Wx, czy Px?

komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
No tu i tu chyba, w Wx jest zapisane a Px dziedziczy od Wx zatem ma wszystkie atrybuty takie same jak Wx czyli jest Wx::degree oraz Pc::degree (czy się mylę?) Bo już serio mam coraz większe wątpliwości
1
komentarz 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

Nie tu i tu, tylko w klasie Wx. Px dziedziczy po Wx, więc to pole jest widoczne.

 

komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
ok a powiedz mi moze oczywiste pytanie i nawet to sprawdzalem ale czy ten kod dziala tak ze Wx posiada int degree, int helper, string degreeStringNum oraz float *coefficients i Px posiada int degree, int helper, string degreeStringNum oraz float *coefficients tyle, ze osobne?
1
komentarz 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

Obie klasy będą posiadać te pola, różnica jest tylko taka, że klasa Wx definiuje je (tworzy), a Px jedynie dziedziczy.

komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
dzieki za potwierdzenie! jednak nadal troche tego nie rozumiem dlaczego nie musze deklarowac tej przyjazni w Px
1
komentarz 19 sierpnia 2020 przez j23 Mędrzec (194,920 p.)
Musiałbyś to zrobić, dla pól zdefiniowanych w tej klasie.
komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
no ok, dziekI! zle zrozumialem to co wczesniej przeczytalem/uslyszalem i tyle

Podobne pytania

0 głosów
2 odpowiedzi 2,060 wizyt
pytanie zadane 28 października 2017 w Android, Swift, Symbian przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 461 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez ******** Początkujący (260 p.)
0 głosów
2 odpowiedzi 217 wizyt
pytanie zadane 18 września 2020 w C i C++ przez stanleylbn Nowicjusz (180 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

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

...