• 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

0 głosów
186 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 (171,780 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 (306,660 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 (41,420 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 (41,420 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 4,297 wizyt
pytanie zadane 30 stycznia 2016 w C i C++ przez Mateo500 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 103 wizyt
0 głosów
1 odpowiedź 97 wizyt

86,484 zapytań

135,240 odpowiedzi

300,482 komentarzy

57,230 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...