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

Static -> konstruktor klasy

Object Storage Arubacloud
0 głosów
211 wizyt
pytanie zadane 23 grudnia 2015 w C i C++ przez niezalogowany

Muszę wiedzieć jak statyczną zmienną przenieść do konstruktora i ją inkrementować, podobnie w destruktorze. Wszystkie funkcje składowe są w osobnym pliku .cpp tak jak konstruktor i destruktor. Szukałem i na forum i u wujka i wgl wszędzie ale nie znalazłem takiego wątku.

2 odpowiedzi

0 głosów
odpowiedź 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
wybrane 23 grudnia 2015
 
Najlepsza
Daj cały kod bo nie wiem czy zdefiniowałeś to zmienną statyczną.
komentarz 23 grudnia 2015 przez niezalogowany
#include "Komponent.h" - dołączenie klasy w której są wirtualne metody

 

plik .h
 

#ifndef BEZPIECZNIK_H_INCLUDED
#define BEZPIECZNIK_H_INCLUDED

#include <string>
using namespace std;

#include "Komponent.h"
class Bezpiecznik :public Komponent
{
public:
    void dodaj();//dodaje bezpiecznik do bazy
    void usun();//usuwa bezpiecznik z bazy
    void zmien();//zmienia wlasciwosci bezpiecznika z bazy

    Bezpiecznik(double=400,double=10,string="szybki");//konstruktor
    ~Bezpiecznik();//destruktor

private:
    static unsigned int il_bez;//ilosc bezpiecznikow
    double napiecie;//maksymalne napiecie
    double prad;//maksymalny prad
    string typ;//typ bezpiecznika(szybki itp)
};
#endif // BEZPIECZNIK_H_INCLUDED

plik .cpp

#include "bezpiecznik.h"

Bezpiecznik::Bezpiecznik(double nap,double amper,string type)
{
    napiecie=nap;
    prad=amper;
    typ=type;
}

Bezpiecznik::~Bezpiecznik()
{

}

void Bezpiecznik::dodaj()
{

}

void Bezpiecznik::usun()
{

}

void Bezpiecznik::zmien()
{

}

 

komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)

Musisz po linijce:

#include "bezpiecznik.h" w pliku .cpp

dodać:

unsigned int Bezpiecznik::il_bez;
 ponieważ musisz utworzyć to zmienną a w klasie dajesz tylko "przepis" na nią. Tylko pamiętaj że ta definicja nie może pojawić się w zakresie {} również int main. Po zrobieniu tego w konstruktorze/destruktorze piszesz il_bez++;

 

komentarz 23 grudnia 2015 przez niezalogowany
Nie kumam ostatniego. To w tym przypadku mam użyć volatile czy jak??
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
Ale tego nie rozumiesz: unsigned int Bezpiecznik::il_bez; ?
komentarz 23 grudnia 2015 przez niezalogowany
ale ja chcę żeby to konstruktor zwiększał tę liczbę a destruktor zmniejszał
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
No to chyba już umiesz zrobić po prostu w ciele destruktora piszesz:

il_bez--;

a w konstruktorze

il_bez++;
komentarz 23 grudnia 2015 przez niezalogowany
i to nie działa
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
A jaki masz błąd?
komentarz 23 grudnia 2015 przez niezalogowany
undefined reference to 'Bezpiecznik::il_bez' ta linijka jest 2 razy wyświetlona
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)

Napewno dodałeś to:

unsigned int Bezpiecznik::il_bez;

w pliku .cpp po zainkludowaniu biblioteki?

komentarz 23 grudnia 2015 przez niezalogowany
ale po co jeszcze raz to pisać skoro jest to w pliku .h
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
Przecież pisałem ci że to musi być bo w klasie jest tylko tego deklaracja. Dodaj to linijke i powinno działać.
komentarz 23 grudnia 2015 przez niezalogowany
no ok. niech będzie
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
Tylko nie próbuj dodawać do pliku .h :D
komentarz 23 grudnia 2015 przez niezalogowany
ok ok to wyjaśnij mi jeszcze czym by to się różniło od volatile
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
Ale że jakbyś zamiast unsigned int dał volatile int ?
komentarz 23 grudnia 2015 przez niezalogowany
dokładnie (12 znaków)
komentarz 23 grudnia 2015 przez Patryk Krajewski Nałogowiec (26,170 p.)
unsigned int oznacza że zmienna może przechowywać tylko liczby >= 0 a

volatile int że kompilator ma być ostrożny bo jeśli w programie napiszemy cout << zmienna to program wypisze wartość zmiennej ale gdy mamy(przykład z Symfonii) termometr i wypiszemy cout << temperatura to pokaże się temperatura(program wyszuka w pamięci i wypiszę) ale gdy za drugim razem w programie nic nie zrobimy z to zmienną a temperatura się zwiększy to wypiszę nam się nie poprawna wartość bo kompilator pomyśli "nie muszę tracić czasu na odczytywanie jej z pamięci, miałem przecież ją zapisaną gdzieś na boku" i temu można zapobiec używająć właśnie przydomka volatile. Rozumiesz?
komentarz 23 grudnia 2015 przez niezalogowany
Aaa... kumam. Ok dzięki :)
0 głosów
odpowiedź 23 grudnia 2015 przez draghan VIP (106,230 p.)
Przepraszam, ale nie rozumiem. Co oznacza, że chcesz "przenieść" zmienną do konstruktora...? To jest zmienna statyczna względem klasy, czy zmienna statyczna względem funkcji?
komentarz 23 grudnia 2015 przez niezalogowany
class Bezpiecznik
{
public:
    void dodaj();//dodaje bezpiecznik do bazy
    void usun();//usuwa bezpiecznik z bazy
    void zmien();//zmienia wlasciwosci bezpiecznika z bazy

    Bezpiecznik(double=400,double=10,string="szybki");//konstruktor
    ~Bezpiecznik();//destruktor

private:
    static unsigned int il_bez;//ilosc bezpiecznikow
    double napiecie;//maksymalne napiecie
    double prad;//maksymalny prad
    string typ;//typ bezpiecznika(szybki itp)
};

Chodzi mi o to by zmienną il_bez inkrementować w konstruktorze i dekrementować w destruktorze. 

komentarz 23 grudnia 2015 przez draghan VIP (106,230 p.)

Czyli jest statyczna względem klasy. Takie zmienne są bardzo podobne do zwykłych zmiennych globalnych. Musisz ją zdefiniować w pliku z kodem programu (cpp) najlepiej w przestrzeni globalnej, w taki sposób:

unsigned int Bezpiecznik::il_bez = 0;

I możesz już używać odwołań do niej, np. w konstruktorze czy destruktorze:

Bezpiecznik::Bezpiecznik(double nap,double amper,string type)
{
    napiecie=nap;
    prad=amper;
    typ=type;
    Bezpiecznik::il_bez++;
}

Bezpiecznik::~Bezpiecznik()
{
    Bezpiecznik::il_bez--;
}

Podobne pytania

0 głosów
1 odpowiedź 337 wizyt
pytanie zadane 2 lipca 2017 w C i C++ przez soarez123 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 729 wizyt
0 głosów
1 odpowiedź 705 wizyt
pytanie zadane 9 kwietnia 2019 w C# przez rav89lodz Użytkownik (590 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!

...