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

jak umozliwic 2 klasom korzystanie z 1 funkcji w 1 pliku.cpp

Object Storage Arubacloud
0 głosów
286 wizyt
pytanie zadane 15 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
edycja 15 sierpnia 2020 przez lujasjeden

Mam takie kody:

polynomials.h

#include <iostream>

using namespace std;

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

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

public:
    virtual void gather();
    virtual void show();
    void isInteger(int &d);

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

isInteger.cpp:

#include <iostream>
#include "polynomials.h"
#include <ctype.h> // isdigit()
#include <sstream> // stringstream
using namespace std;

void Wx::isInteger(int &d)
{
    int isInt=0;
    int decimalCount=0;

    bool isIntBool=false;
    bool containsSpaces = false;

    do
    {
        getline(cin, userStringNum);
        for (int i=0; i<userStringNum.size(); i++)
        {
            if (isspace(userStringNum[i]))
                containsSpaces=true;
        }

        if (userStringNum[0] == '-')
        {
            isInt++;

            if (userStringNum[1]=='0')
                isInt=0;
        }

        if ((userStringNum[0]=='0' && isdigit(userStringNum[1])))
            isInt = 0;
        else
        {
            for (int i=0; i<userStringNum.size(); i++)
            {
                if (isdigit(userStringNum[i]))
                    isInt++;
                if (userStringNum[i]=='.')
                    decimalCount++;
            }
        }

        if (decimalCount==1)
            isInt=0;

        if (isInt==userStringNum.size() && containsSpaces==false)
        {
            stringstream str_stream_object(userStringNum);
            str_stream_object>>d;

            isIntBool=1;
        }

        else
        {
            cout<<endl;
            cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";

            isIntBool=0;
            isInt=0;
            decimalCount=0;
            containsSpaces=false;
        }

    }
    while (isIntBool==0);
}

gatherWx:

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

void Wx::gather()
{
    cout<<"Input degree of polynomial W(x): ";
    isInteger(degree);
    cout<<endl;
}

gatherPx:

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

void Px::gather()
{
    cout<<"Input degree of polynomial P(x): ";
    isInteger(degree);
    cout<<endl;
}

jakim cudem isInteger dziala w pliku gatherPx skoro w pliku isInteger jest tylko taki zapis:

void Wx::isInteger(int &d)

nie ma w ogole Px::isInteger

komentarz 15 sierpnia 2020 przez ScriptyChris Mędrzec (190,190 p.)
Proszę poprawić tytuł tematu, żeby zwięźle i dokładnie opisywał problem.

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2020 przez adrian17 Ekspert (344,860 p.)

jakim cudem isInteger dziala w pliku gatherPx skoro w pliku isInteger jest tylko taki zapis:

Px dziedziczy po Wx, więc korzysta z jego isInteger. Dokładnie po to jest dziedziczenie.

komentarz 16 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
edycja 16 sierpnia 2020 przez lujasjeden
Ej dobra bo teraz to juz sie kompletnie zgubilem, proste pytanie czy jak odziedziczam w klasie Px atrybuty od Wx, to np operujac w funkcjach Wx::gather oraz Px::gather to operuje tak naprawde na tym samym?

Czy jak Px dziedziczy od Wx to dostaje jakby nowe stworzone odzielne atrybuty z tymi samymi nazwami ale pobierajac jaki atrybut od uzytkownika z klawiatury w funkcji Wx::gather to leci to do atrybutu tylko Wx czy do obu

 

Bo tak teraz sobie zdalem sprawe, ze jezeli nie przeslonie tych atrybutow w klasie pochodnej to nie jestem pewny jak to dziala, a znowu jak przeslonie to przeciez pisze dokladnie to samo jakbym nie robil dziedziczenia, juz nic nie rozumiem
komentarz 16 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Tak średnio rozumiem Twój potok słów.
Jeżeli masz klasę A i klasę B, która dziedziczy po A, to klasa B nie dzieli pamięci z klasą A. Wszystko jest osobne. Dzielą TYLKO implementację.
komentarz 16 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
a ok, czyli ze jezeli wczytam jakis atrybut klasy A to klasa B go sobie rowniez nie przypisuje?
komentarz 16 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
// Example program
#include <iostream>

class A
{
    protected:
    int x;
    public:
    A(){}
    A(int _x):x{_x}{}
    int print(){return x;}
};

class B : public A
{
    public:
    B(){}
    B(int _x){x=_x;}
};

int main()
{
    A a(4);
    std::cout<<a.print()<<'\n';
    B b(3);
    std::cout<<b.print()<<'\n';
    std::cout<<a.print()<<'\n';

}

Nie przypisuje. 

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

to ja juz nic nie wiem, siedze pare dni i praktycznie nic nie mam, dlaczego jak ten program dochodzi do momentu wywolania 

pointerPx->gather();

to nie wczytuje mi juz z klawiatury userStringNum, dla Wx wczytuje dla Px nie, domyslam sie, ze chodzi o to ze isInteger nie ma dostepu do Px::gather ale to jak to w takim razie zrobic, przeciez jak dam mu dostep w innym pliku i przekleje kod to to nie ma totalnie sensu, w ogole prosze o powiedzenie czy to w ogole co jest napisane ma sens, bo ja juz sie totalnie poglubilem, chodzi mi czy obie klasy maja swoje odzielne atrybuty, pobieranie od uzytkownika przypisuje poprawnym atrybutom (ze nie ma sytuacji ze Px::gather przypisuje dla atrybutu Wx::degree, bo ja juz serio mam metlik w glowie)

Tu sa wszystkie kody:

main:

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

int main()
{
    Wx w;
    Px p;

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

polynomials.h:

#include <iostream>

using namespace std;

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

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

public:
    virtual void gather();
    virtual void show();
    void isInteger(int &d);

    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.h:

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

using namespace std;

Wx::Wx(string uNS, int d, int h)
{
    userStringNum=uNS;
    degree=d;
    helper=h;
    coefficients=new float[d+1];
    cout<<"1 konstruktor zadzwonil";
    cout<<endl;
}
Wx::~Wx()
{
    delete [] coefficients;
    cout<<"1 destruktor zadzwonil";
    cout<<endl;
}

Px::Px(string uNS, int d, int h)
:Wx(uNS, d, h)
{
    coefficients=new float[d+1];
    cout<<"2 konstruktor zadzwonil";
    cout<<endl;
}
Px::~Px()
{
    delete [] coefficients;
    cout<<"2 destruktor zadzwonil";
    cout<<endl;
}

gatherWx:

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

void Wx::gather()
{
    cout<<"Input degree of polynomial W(x): ";
    isInteger(degree);
    helper=degree;

    coefficients = new float[degree+1];

    cout<<"Input coefficients and constant of polynomial W(x): ";
    cout<<endl;
    for (int i=degree; i>=0; i--)
    {
        cin>>coefficients[i];
    }
}

gatherPx:

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

void Px::gather()
{
    cout<<"Input degree of polynomial P(x): ";
    isInteger(degree);
    helper=degree;

    coefficients = new float[degree+1];

    cout<<"Input coefficients and constant of polynomial P(x): ";
    cout<<endl;
    for (int i=degree; i>=0; i--)
    {
        cin>>coefficients[i];
    }
}

isInteger:

#include <iostream>
#include "polynomials.h"
#include <ctype.h> // isdigit()
#include <sstream> // stringstream
using namespace std;

void Wx::isInteger(int &d)
{
    int isInt=0;
    int decimalCount=0;

    bool isIntBool=false;
    bool containsSpaces = false;

    do
    {
        getline(cin, userStringNum);
        for (int i=0; i<userStringNum.size(); i++)
        {
            if (isspace(userStringNum[i]))
                containsSpaces=true;
        }

        if (userStringNum[0] == '-')
        {
            isInt++;

            if (userStringNum[1]=='0')
                isInt=0;
        }

        if ((userStringNum[0]=='0' && isdigit(userStringNum[1])))
            isInt = 0;
        else
        {
            for (int i=0; i<userStringNum.size(); i++)
            {
                if (isdigit(userStringNum[i]))
                    isInt++;
                if (userStringNum[i]=='.')
                    decimalCount++;
            }
        }

        if (decimalCount==1)
            isInt=0;

        if (isInt==userStringNum.size() && containsSpaces==false)
        {
            stringstream str_stream_object(userStringNum);
            str_stream_object>>d;

            isIntBool=1;
        }

        else
        {
            cout<<endl;
            cout<<"Degree of polynomial has to be an integer greater than 0, try again: ";

            isIntBool=0;
            isInt=0;
            decimalCount=0;
            containsSpaces=false;
        }

    }
    while (isIntBool==0);
}

showWx:

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

void Wx::show()
{
    cout<<"showWx zadzwonil";
    cout<<degree;
    cout<<helper;
    cout<<endl;
}

showPx:

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

void Px::show()
{
    cout<<"showPx zadzwonil";
    cout<<endl;
    cout<<degree;
    cout<<helper;
    cout<<endl;
}

Przy wywolaniu showPx wyswietla sie 00, czyli degree=0, helper=0, wiem ze to od konstruktora, czyli isInteger nie dziala dla gatherPx, dlaczego?

Skoro kiedy mam tylko tak:

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

void Wx::gather()
{
    cout<<"Input degree of polynomial W(x): ";
    isInteger(degree);
    helper=degree;

   /* coefficients = new float[degree+1];

    cout<<"Input coefficients and constant of polynomial W(x): ";
    cout<<endl;
    for (int i=degree; i>=0; i--)
    {
        cin>>coefficients[i];
    }
*/
}

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

void Px::gather()
{
    cout<<"Input degree of polynomial P(x): ";
    isInteger(degree);
    helper=degree;

 /*   coefficients = new float[degree+1];

    cout<<"Input coefficients and constant of polynomial P(x): ";
    cout<<endl;
    for (int i=degree; i>=0; i--)
    {
        cin>>coefficients[i];
    }
    */
}

output:

1 konstruktor zadzwonil
1 konstruktor zadzwonil
2 konstruktor zadzwonil
Input degree of polynomial W(x): 4
Input degree of polynomial P(x): 7
showWx zadzwonil44
showPx zadzwonil
77
2 destruktor zadzwonil
1 destruktor zadzwonil
1 destruktor zadzwonil

jak widac tutaj isInteger dziala bo wyskakuje 44, 77, a nie 44, 00 jakby wczesniej mialo miejsce, w ogole czy te 4 zostaja? ze Wx::degree=4; oraz Wx::helper=4 nadal czy one sa przeslaniane siódemkami?

 

Nie wiem mam wrazenie, ze czym dluzej nad tym siedze tym mniej rozumiem

Podobne pytania

0 głosów
4 odpowiedzi 6,027 wizyt
pytanie zadane 30 stycznia 2016 w C i C++ przez Mateo500 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 165 wizyt
pytanie zadane 5 czerwca 2023 w C i C++ przez p4wix Obywatel (1,040 p.)
0 głosów
2 odpowiedzi 195 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 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!

...