ik wist niet zo goed wat voor titel ik het moest geven, maar ik zit met hetvolgende probleem.
ik wil in mijn applicatie een centraal punt hebben waar bepaalde objecten zichzelf kunnen "registeren". ik heb/wil dit doormiddel van een singleton doen. nu ben ik oorspronkelijk een java progger, waarmee dit me prima lukt alleen stuit ik op een probleem in C++. omdat het wat lastig uitleggen is heb ik hier even een klein voorbeeldje van wat ik wil.
hier de code in C++ (wat dus niet werkt!!, bestaande uit Foo, FooManager, FooApp (.h & .cpp files))
Foo.h
Foo.cpp
FooManager.h (volgens het singleton pattern)
FooManager.cpp
FooApp.cpp (main enzo..)
Deze code geeft dus problemen. Voor zover ik heb kunnen concluderen komt dit door de dubbele referentie van Foo naar FooManager en FooManager naar Foo. De compiler snapt er namelijk helemaal niks meer van (wat ik opzig wel begrijpelijk vind), maar als ik het equivalent in java prog dan werkt het allemaal prima.
de compiler komt met de meldingen: "missing storage-class or type specifier"
verder nog meer errors, maar die zijn naar mijn mening allemaal het resultaat van deze foutmelding
hier volgt de vergelijkbare java code: Foo.java, FooManager.java, FooApp.java
Foo.java
FooManager.java
FooApp.java
de bovenstaande code werkt dus prima. ik krijg het in c++ alleen aan de praat als ik bijvoorbeeld de "Foo" class subclass van een "Fum" class en dan in "FooManager" niet een "Foo" class te registeren maar een "Fum" class... dit is natuurlijk totaal niet mooi omdat ik dan steeds in "FooManager" al die "Fum" instanties moet gaan casten naar "Foo" instanties (met de alle foutgevoeligheid van dien).
ik hoop dat mijn verhaal een beetje duidelijk is en dat iemand mij kan vertellen of het uberhaupt mogelijk is op de manier zoals ik dat wil. zo ja wat doe ik verkeerd of moet er verandert worden. andere suggesties zijn altijd welkom.
ik wil in mijn applicatie een centraal punt hebben waar bepaalde objecten zichzelf kunnen "registeren". ik heb/wil dit doormiddel van een singleton doen. nu ben ik oorspronkelijk een java progger, waarmee dit me prima lukt alleen stuit ik op een probleem in C++. omdat het wat lastig uitleggen is heb ik hier even een klein voorbeeldje van wat ik wil.
hier de code in C++ (wat dus niet werkt!!, bestaande uit Foo, FooManager, FooApp (.h & .cpp files))
Foo.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #ifndef _FOO_H_ #define _FOO_H_ #include <iostream> #include "FooManager.h" class Foo{ private: FooManager * fm; public: Foo(); void DoFoo(); }; #endif |
Foo.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| #include "Foo.h" Foo::Foo(){ fm = FooManager::GetInstance(); fm->RegisterFoo(this); std::cout << "Foo Created" << std::endl; } void Foo::DoFoo(){ std::cout << "DoFoo" << std::endl; } |
FooManager.h (volgens het singleton pattern)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| #ifndef _FOOMANAGER_H_ #define _FOOMANAGER_H_ #include <iostream> #include "Foo.h" class FooManager{ private: static FooManager * _instance; //singleton instance Foo * m_foos[10]; //store 10 foos int m_nFooCount; protected: FooManager(); public: static FooManager * GetInstance(); //retrieve instance void RegisterFoo(Foo * f); }; #endif |
FooManager.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include "FooManager.h" #include "Foo.h" FooManager * FooManager::_instance = 0; FooManager * FooManager::GetInstance(){ if(_instance == 0) _instance = new FooManager(); return _instance; } FooManager::FooManager(){ m_nFooCount = 0; std::cout << "FooManager Created" << std::endl; } void FooManager::RegisterFoo(Foo * f){ m_foos[m_nFooCount++] = f; //dit geeft nog geheugen foutmeldingen maar is op dit moment niet belangrijk std::cout << "Foo Registered" << std::endl; } |
FooApp.cpp (main enzo..)
C++:
1
2
3
4
5
6
7
| #include "FooManager.h" #include "Foo.h" int main(){ Foo f; f.DoFoo(); } |
Deze code geeft dus problemen. Voor zover ik heb kunnen concluderen komt dit door de dubbele referentie van Foo naar FooManager en FooManager naar Foo. De compiler snapt er namelijk helemaal niks meer van (wat ik opzig wel begrijpelijk vind), maar als ik het equivalent in java prog dan werkt het allemaal prima.
de compiler komt met de meldingen: "missing storage-class or type specifier"
verder nog meer errors, maar die zijn naar mijn mening allemaal het resultaat van deze foutmelding
hier volgt de vergelijkbare java code: Foo.java, FooManager.java, FooApp.java
Foo.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import FooManager; public class Foo{ private FooManager fm; public Foo(){ fm = FooManager.getInstance(); fm.registerFoo(this); System.out.println("Foo Created"); } public void doFoo(){ System.out.println("DoFoo"); } } |
FooManager.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| import Foo; public class FooManager{ private static FooManager _instance = null; private Foo foos[]; private int fooCount; public static getInstance(){ if(_instance == null){ _instance = new FooManager(); } return _instance; } public FooManager(){ foos = new Foo[10]; fooCount = 0; System.out.println("FooManager Created"); } public void registerFoo(Foo foo){ foos[fooCount++] = foo; System.out.println("Foo Registered"); } } |
FooApp.java
Java:
1
2
3
4
5
6
7
8
9
| import Foo; public class FooApp{ public static void main(String[] args){ Foo foo = new Foo(); foo.doFoo(); } } |
de bovenstaande code werkt dus prima. ik krijg het in c++ alleen aan de praat als ik bijvoorbeeld de "Foo" class subclass van een "Fum" class en dan in "FooManager" niet een "Foo" class te registeren maar een "Fum" class... dit is natuurlijk totaal niet mooi omdat ik dan steeds in "FooManager" al die "Fum" instanties moet gaan casten naar "Foo" instanties (met de alle foutgevoeligheid van dien).
ik hoop dat mijn verhaal een beetje duidelijk is en dat iemand mij kan vertellen of het uberhaupt mogelijk is op de manier zoals ik dat wil. zo ja wat doe ik verkeerd of moet er verandert worden. andere suggesties zijn altijd welkom.
[ Voor 6% gewijzigd door CyBoB op 25-03-2004 16:36 ]