Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Staticke premenne v triedach

Aktivity
Avatar
Philip Recek
Člen
Avatar
Philip Recek:20.2.2019 16:18

Dobry den. Ucim sa programovat v c++ a narazil som na mensi problem.

Zkusil jsem:

class X
{
    static int i;
    public:
    X()
    {
        // construtor
    };
};

int X::i=1;

int main()
{
    X obj;
    cout << obj.i;   // prints value of i
}

Rozumie o co tam asi ide, ze staticke data sa nesmu inicializovat priamo v triede pretoze to sposobi ich definiciu (teda vyhradenie pamate), a ak by sme mali definiciu tejto triedy v nejakom hlavickovom subore tak by to bolo nespravne pretoze by tak mohla vzniknut chyba viacnasobnej definicie.

Chci docílit: Moja otazka je, ze preco napr. : static int cislo; nieje samo o sebe definiciou
Ved ak mame napr. int cislo; nieje nutne ho inicializovat aby to bola definicia.

 1 void funkcia()
 2 {
 3     static int cislo; // je toto definicia alebo decklaracia?
 4 }
 5
 6 int main()
 7 {
 8     funkcia();
 9 }
10
 
Odpovědět
20.2.2019 16:18
Avatar
Odpovídá na Philip Recek
Patrik Valkovič:20.2.2019 17:52

static int i je deklarace. Jak správně říkáš, definice by měla být jen jedna, měla by se tedy přesunout do .cpp souboru.

//X.h
class X
{
    static int i;
    public:
    X();
};

//X.cpp
#include "X.h"
int X::i=1;

X::X() {
    // ...
}

//main.cpp
#include "X.h"

int main()
{
    X obj;
    cout << obj.i;   // prints value of i
}

Ve druhém případě se jedná o definici, správně by tělo metody mělo být implementované v .cpp souboru.

//funkce.h
void funkce();

//funkce.cpp
void funkce(){
    static int cislo;
}

//main.cpp
#include "funkce.h"

int main(){
    funkce();
}

Pokud není proměná inicializována (tak jak je to výše), je automaticky inicializována výchozí hodnotou (pro int je to 0). Jedná se tedy o definici.

Nahoru Odpovědět
20.2.2019 17:52
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Philip Recek
Člen
Avatar
Philip Recek:20.2.2019 17:59

Podla coho teda kompilator rozlisuje kedy ide o definiciu a kedy o deklaracie ak syntax je rovnaka? Ako vie ze v prvom pripade ( v definicii triedy ) nejde o definiciu a ze tam nema nastavyt vychodzu hodnotu 0?

Editováno 20.2.2019 18:00
 
Nahoru Odpovědět
20.2.2019 17:59
Avatar
Odpovídá na Philip Recek
Patrik Valkovič:20.2.2019 19:55

Protože v prvním případě je zápis ve třídě zatímco ve druhém případě v metodě?

class X{
public:
    int x;
};

void funkce(){
    int x;
}

I tady je přece zápis naprosto stejný, přesto první je pouze deklarace zatímco druhé je definice.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.2.2019 19:55
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.