Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Avatar
Philip Recek
Člen
Avatar
Philip Recek:20. února 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. února 16:18
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Philip Recek
patrik.valkovic:20. února 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. února 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. února 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. února 18:00
 
Nahoru Odpovědět 20. února 17:59
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Philip Recek
patrik.valkovic:20. února 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í
+1 bodů
Řešení problému
Nahoru Odpovědět 20. února 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.