dziedziczenie pola statycznego

0

Chcialbym stworzyc, ale nie wiem jeszcze jak, kod w ktorym jest klasa bazowa, ktora zawiera pole statyczne zliczajace ilosc stworzonych obiektow pochodnych, np mam klase nadrzedna osoba i dwie klasy pochodne np. uczen i nauczyciel i chce tworzyc obiekty tylko tych klas pochodnych(znaczy sie musze zrobic klase osoba klasa abstrakcyjna) tylko nie wiem jak zrobic aby stworzenie obiektow klas pochodnych pociagalo za soba modyfikacje licznika obiektow w sekcji chronionej klasy bazowej(pewnie chodzi cos o dziedziczenie konstruktorow), mam przykladowy kod w ktorym zliczana jest ilosc obiektow tej samej klasy, a nie wiem jak zmodyfikowac go tak aby mozna bylo tylko tworzyc obiekty pochodne i to one bylyby zliczane w polu klasy bazowej Osoba:

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

class Osoba
{
      public:
             static int counter;
         string name;

         Osoba(string n) : name(n)
         {
             ++counter;
            cout << "Zwiekszam\n ";
         }

         string getName()
         {
             return name;
         }
};

int Osoba::counter = 0;

int main(int argc, char *argv[])
{
    vector<Osoba> vec;
    string objectName;

   do
   {
       cout << "Podaj nazwe obiektu (exit = wyjscie) :";
       cin >> objectName;

       if(objectName == "exit")
           break;
       vec.push_back(Osoba(objectName));
    }
    while(true);

    cout << "Podales: " << Osoba::counter << " obiektow\n";

    for(int i = 0; i < Osoba::counter; i++)
        cout << "Obiekt nr: " << i << " posiada nazwe " << vec[i].getName() << endl;

    return EXIT_SUCCESS;
}
 
0

No dobra ale gdzie jest problem? Jak chcesz to dodaj czysto wirtualną metodę do tej klasy i będzie abstrakcyjna. A poza tym powinno być ok.

0
Shalom napisał(a):

No dobra ale gdzie jest problem? Jak chcesz to dodaj czysto wirtualną metodę do tej klasy i będzie abstrakcyjna. A poza tym powinno być ok.

coprawda dopiero od niecalego miesiaca programuje w c++(wczesniej w poprzednim semestrze mialem pp a tam tylko czyste c i struktury)
i nie wiem za bardzo jak sprawic aby tworzenie klas pochodnych(nie bazowej bo tejze obiektow mam nie tworzyc) pociagalo za soba modyfikacje licznika w klasie bazowej
(licznik jest ustawiony w konstruktorze klasy bazowej), przepraszam bo moze jednak nie zbyt jasno sprecyzowalem swoj problem(troche jeszcze gubie sie w tych zasadach obiektowosci)

0

Z konstruktora klasy pochodnej wywołuj konstruktor klasy bazowej.

0
some_ONE napisał(a):

Z konstruktora klasy pochodnej wywołuj konstruktor klasy bazowej.

dzieki, sprobuje i przedstawie wyniki

0
some_ONE napisał(a):

Z konstruktora klasy pochodnej wywołuj konstruktor klasy bazowej.

a moglbys przykladowo pokazac jak to sie robi, bo nie wiem czy to jest w porzadku(nie kompiluje sie)

 #include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

class Osoba
{
      public:
             static int counter;
         string name;

         Osoba(string n) : name(n)
         {
             ++counter;
            cout << "Zwiekszam\n ";
         }

         string getName()
         {
             return name;
         }
};

class OsobaPoch:public Osoba
{
public:
    OsobaPoch():Osoba(){}
};

int Osoba::counter = 0;

int main(int argc, char *argv[])
{
    vector<Osoba> vec;
    string objectName;

   do
   {
       cout << "Podaj nazwe obiektu (exit = wyjscie) :";
       cin >> objectName;

       if(objectName == "exit")
           break;
       vec.push_back(Osoba(objectName));
    }
    while(true);

    cout << "Podales: " << Osoba::counter << " obiektow\n";

    for(int i = 0; i < Osoba::counter; i++)
        cout << "Obiekt nr: " << i << " posiada nazwe " << vec[i].getName() << endl;

    return EXIT_SUCCESS;
}
2

No a masz konstruktor klasy Osoba bez parametrów? Nie masz. No to co się dziwisz? o_O

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

class Osoba
{
public:
    static int counter;
    string name;

    Osoba(string n) : name(n)
    {
        ++counter;
        cout << "Zwiekszam\n ";
    }

    string getName()
    {
        return name;
    }
};

class OsobaPoch:public Osoba
{
public:
    OsobaPoch(string n):Osoba(n) {}
};

int Osoba::counter = 0;

int main(int argc, char *argv[])
{
    vector<Osoba> vec;
    string objectName;

    do
    {
        cout << "Podaj nazwe obiektu (exit = wyjscie) :";
        cin >> objectName;

        if(objectName == "exit")
            break;
        vec.push_back(OsobaPoch(objectName));
    }
    while(true);

    cout << "Podales: " << Osoba::counter << " obiektow\n";

    for(int i = 0; i < Osoba::counter; i++)
        cout << "Obiekt nr: " << i << " posiada nazwe " << vec[i].getName() << endl;

    return EXIT_SUCCESS;
}
0
Shalom napisał(a):

No a masz konstruktor klasy Osoba bez parametrów? Nie masz. No to co się dziwisz? o_O

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

class Osoba
{
public:
    static int counter;
    string name;

    Osoba(string n) : name(n)
    {
        ++counter;
        cout << "Zwiekszam\n ";
    }

    string getName()
    {
        return name;
    }
};

class OsobaPoch:public Osoba
{
public:
    OsobaPoch(string n):Osoba(n) {} ///wiem, ze tu jest blad ale nie wiem jak to zmienic(dopiero od niedawna cos robie w c++)
};

int Osoba::counter = 0;

int main(int argc, char *argv[])
{
    vector<Osoba> vec;
    string objectName;

    do
    {
        cout << "Podaj nazwe obiektu (exit = wyjscie) :";
        cin >> objectName;

        if(objectName == "exit")
            break;
        vec.push_back(OsobaPoch(objectName));
    }
    while(true);

    cout << "Podales: " << Osoba::counter << " obiektow\n";

    for(int i = 0; i < Osoba::counter; i++)
        cout << "Obiekt nr: " << i << " posiada nazwe " << vec[i].getName() << endl;

    return EXIT_SUCCESS;
}

prosze, jak bys mogl mi spokojnie wytlumaczyc gdzie jaki robie blad?

0

Przecież kompilator sam ci mówi gdzie zrobiłeś błąd o_O
OsobaPoch():Osoba(){} tutaj
Próbujesz wywołać konstruktor Osoba() który nie istnieje. Może zerkniesz na log kompilatora? Przecież jasno daje ci do zrozumienia że taki konstruktor nie istnieje i nawet proponuje ci jakie istnieją... No ale po co czytać komunikaty. Nie kompiluje się? To z płaczem na forum, ktoś pomyśli za ciebie...

0
Shalom napisał(a):

Przecież kompilator sam ci mówi gdzie zrobiłeś błąd o_O
OsobaPoch():Osoba(){} tutaj
Próbujesz wywołać konstruktor Osoba() który nie istnieje. Może zerkniesz na log kompilatora? Przecież jasno daje ci do zrozumienia że taki konstruktor nie istnieje i nawet proponuje ci jakie istnieją... No ale po co czytać komunikaty. Nie kompiluje się? To z płaczem na forum, ktoś pomyśli za ciebie...

znam angielski, ale nie zabardzo jeszcze rozumiem wszystkie logi kompilatora, te proste tak ale te bardziej ezoteryczne przyprawiaja mnie o zawrot glowy(korzystam z C::B)
oto co mi wyskoczylo:
initializing argument 1 of std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) (with _CharT=char; _Traits=std:: itp.
nie wiem zupelnie jak takie cos zinterpretowac

jeszcze drugi blad mi wyskoczyl, ale ten w miare rozumiem:
invalid conversion from 'int' to 'const char*' [f-permissive]

0

No ale co ty w takim razie kompilujesz? Bo mi twój kod daje:

D:\code blocks\test\513.cpp||In constructor 'OsobaPoch::OsobaPoch()':|
D:\code blocks\test\513.cpp|29|error: no matching function for call to 'Osoba::Osoba()'|
D:\code blocks\test\513.cpp|14|note: candidates are: Osoba::Osoba(std::string)|
D:\code blocks\test\513.cpp|9|note: Osoba::Osoba(const Osoba&)|
||=== Build finished: 1 errors, 0 warnings ===|

A IDEOne daje

prog.cpp: In constructor 'OsobaPoch::OsobaPoch()':
prog.cpp:29:23: error: no matching function for call to 'Osoba::Osoba()'
OsobaPoch():Osoba() {}
^
prog.cpp:29:23: note: candidates are:
prog.cpp:14:5: note: Osoba::Osoba(std::string)
Osoba(string n) : name(n)
^
prog.cpp:14:5: note: candidate expects 1 argument, 0 provided
prog.cpp:8:7: note: Osoba::Osoba(const Osoba&)
class Osoba
^
prog.cpp:8:7: note: candidate expects 1 argument, 0 provided
prog.cpp:8:7: note: Osoba::Osoba(Osoba&&)
prog.cpp:8:7: note: candidate expects 1 argument, 0 provided

0

przepraszam, za moje nieco glupie pytania, ale na prawde jeszcze tego nie ograniam, btw wielkie dzieki dla osoby, co zmienila moj ortyginalny kod
OsobaPoch(string n):Osoba(n){} wystarczylo zrobic to w tej linijce i sie kompiluje, przepraszam, ale moja wiedza wyglada troche blado, bo to moj pierwszy kontakt z jakimkolwiek realnym jezykiem(pomijajac logo komeniusza w podstawowce;)), wczesniej jak probowalem ustawic jakies parametry to pisalo mi ze dana zmienna 'was not declared in this scope' wczesniej mialem troche stycznosc z c wiec juz troche wiem jak sie ma sprawa z widocznoscia zmiennych, gorzej tylko, ze nie wiem jak to jeszcze wyglada dla klas, a szczegolnie ich konstruktorow

wielkie dzieki za pomoc

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