[c++] statyczna dana składowa, problem

0

Dlaczego występuje błąd linkera ? Poniżej odpowiednio skrócony kod:

klasa.h

#ifndef klasa_H
#define klasa_H

class testowa
{
public:
	static const int zmienna = 2;

};

#endif 

klasa.cpp

#include "klasa.h"

const int testowa::zmienna;

main.cpp

#include<iostream>
#include "klasa.h"

using namespace std;




void main()
{

    cout<<endl;
    cout<<testowa::zmienna;
    cout<<endl;
    system("pause");
}
0

Po co ci: const int testowa::zmienna; ?
Mnie ten program kompiluje się normalnie.

0

Jeśli dana składowa statyczna jest const, o typie całkowitym, oraz inicjalizuje się ją całkowitą wartością to inicjalizacja może nastąpić wewnątrz klasy.

0

Po to, żeby ta dana składowa była traktowana jako normalny obiekt ( choćby możliwość pobrania adresu), a nie jak stała całkowita z listy wyliczeniowej. Bez definicji poza ciałem klasy taka statyczna dana składowa jak u mnie w programie byłaby zrealizowana przez kompilator w ten sposób jak stała całkowita z listy wyliczeniowej.

0
Abcc napisał(a)

Po to, żeby ta dana składowa była traktowana jako normalny obiekt ( choćby możliwość pobrania adresu), a nie jak stała całkowita z listy wyliczeniowej. Bez definicji poza ciałem klasy taka statyczna dana składowa jak u mnie w programie byłaby zrealizowana przez kompilator w ten sposób jak stała całkowita z listy wyliczeniowej.

Ale nadal mialaby swoj pobieralny adres, typu const int*/&, ot, mozliwe ze inny w kazdym pliku .cpp
O ile dobrze pamietam, przy polach static-const-integral niezalecane jest wlasnoreczne podawanie fizycznej lokalizacji zmiennej (tzn. definiowanie explicite jej w jakims jednym .cpp) - pozostawia sie to wlasnie kompilatorowi, ktory te lokalizacje wybierze na podstawie Twoich pobieran adresow, użyc zmiennych, funkcjach, etc.
Poza tym, to że sobie ja gdzieś przygwoździłes tą definicja w pliku .cpp, NIE znaczy ze kompilator NIE potraktuje jej jako stała i NIE skopiuje wartościowo w miejscach użyc. w dalszym ciagu moze sobie ja pokopiowac dowolna ilosc razy.*) const czasu kompilacji, to const czasu kompilacji.. *)

wracajac do problemu: racz podac ten blad, ok?

jezeli jest to ze symbol jest zdefiniowany dwa razy - to pewnie z tego powodu co powiedzialem powyzej.. ale to by sugerowalo ze masz walniety kompilator, ktory nie patrzy co juz jest zdefiniowane i probuje na chama uzyc automatycznego umiejscawiania definicji pola..

edit: *) przypomniałem sobie "conceptual constness" i zwatpiłem. lepiej sprawdzic na swoim kompilatorze jak jego autorzy ten termin rozumieli

0

Visual Studio 2008

Testowy.exe not found or not built by the last incremental link; performing full link
1>main.obj : error LNK2005: "public: static int const testowa::zmienna" (?zmienna@testowa@@2HB) already defined in klasa1.obj

Testowy.exe : fatal error LNK1169: one or more multiply defined symbols found

0

...zapoznaj się więc z: http://4programmers.net/Forum/637666#id637666 i popraw sugerowane tam przyczyny
cokolwiek zrobisz bedzie poprawne -- chyba ze masz zamiar ten wskaznik potem const_castowac i jednak zmieniac te 'stałą" ?

0

walnij rebuild ;)

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