Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

26.02.2005, 20:16

was denn genau?

C-/C++-Quelltext

1
2
3
4
CMath *vec:
vec = new CVector2D();

((CVector2D*)vec)->add(1, 2);

12

26.02.2005, 20:37

mal zu deinem bsp oben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//----vector2d.h


#ifdef _WINDLL
#   define ENGINE_API __declspec(dllexport)
#else
#   define ENGINE_API __declspec(dllimport)
#endif


struct ENGINE_API  vector2d{
   float x;
   float y;

   vector2d(){};
   vector2d(float a, float b){x = a; y = b;};
   vector2d &operator +=(vector2d &b){
       x += b.x;
       y += b.y;
       return *this;
   };

   vector2d  operator +(vector2d &b)const{
       return vector2d(x + b.x, y + b.y);
   };

   //is eigentl. ueberfluessig

   vector2d &operator =(vector2d &b){
      x = b.x; y = b.y;
      return *this;
   };

   vector2d &add(vector2d &b){
      x += b.x;
      y += b.y;
      return *this;
   };
};

//---main.cpp


#include <iostream>
#include "vector2d.h"
#pragma comment(lib, "enginedll.lib")

int main(){
   using namespace std;
   vector2d va(1, 2), vb(3, 4);
   vector2d *res;
   
   //damit auch ein new drin is :)

   res = new vector2d();
   (*res) = va + vb;

   //sollte "result: 4, 6" ausspucken

   cout<<"result: "<<res->x<<", "<<res->y<<endl;

   (*res) = vector2d(1, 2);
   res->add(va);

   //sollte "result: 2, 4" ausspucken

   cout<<"result: "<<res->x<<", "<<res->y<<endl;

   delete res;
   return 0;
}

13

26.02.2005, 20:54

...

hallo. danke aber hm... ich will mir bald ne engine schreiben und die soll halt oop sein und pro "bereich" will ich eine eigene dll machen.
->mathe.dll input.dll sound.dll
als beispiel habe ich mathe genommen und eine abstrakte klasse geschrieben von der 2 klassen erben(denke ich mal) aber das ist zu umständlich und hat doch da keinen sinn siehe meinen code
wie man das in eine dll-verpackt ist mir erstmal egal bekomm ich schon hin. aber wie soll ich die klassen designen? und bei dem tutorial von flipcode steht das selbe drinne was ich eigentlich bisher wusste.
cu

14

26.02.2005, 21:00

also wenn du sowas einfaches wie vector-klassen hast
brauchst du sicher keine abstracte basisklasse.
interessant wird sowas wohl erst bei komplexeren geschichten.
z.b.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ENGINE_API baseShader{
private:
protected:
public:
 virtual bool loadFromFile(const char *) = 0;
 virtual bool setFConstant(float *, uint) = 0;
 //...etc.

};

class ENGINE_API vertexShader:public baseShader{
public:
   bool loadFromFile(const char *){//...};

   bool setFConstant(float *f, uint size){

      return SUCCEEDED(device->SetVertexShaderConstantF(f, size));
   };
};

class ENGINE_API pixelShader:public baseShader{
public:
   bool loadFromFile(const char *){//...};

   bool setFConstant(float *f, uint size){

      return SUCCEEDED(device->SetPixelShaderConstantF(f, size));
   };
};


was soll man sonst noch groß dazu sagen?
ich würd mir gut überlegen wo oop wirklich sindvoll ist
und wo nicht.

15

26.02.2005, 21:06

ps: wieso willst du eigentlich pro bereich ne eigene dll machen.

da könntest du schnell folgendes "prob" kriegen:

wenn du in der grafik-abteilung einen vector definierst
und in der mathe-dll mathematische funktionen die auch
auf vectoren operrieren musst du eintweder 2 unabhängige
vector-klassen implementiern und dann immer konvertieren
was irgendwie scheiße ist
oder die eine dll muss die andere dll einbindern.
das is doch irgendwie auch nicht sinn der sache.
dann kannst de gl. alles in eine stopfen.

was ich sagen will ist eigentlich nur das du deine
aufteilung überdenken solltest.
was noch sinn macht is vielleicht
sound & grafik zu trennen.
splitte es nicht zu sehr auf.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

26.02.2005, 21:25

bei einfachen klassen (vectoren, matritzen etc.) würd ich auf basisklassen und ableitereien verzichten, weil der aufruf von virtuellen funktionen etwas langsamer ist und z.b. bei mathe kommts eben doch auf die performance an ;)

17

26.02.2005, 21:40

vielen dank

vielen dank dann werde ich es mit abstrakten klassen lassen.
cu :huhu:

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

18

28.02.2005, 10:20

Ich arbeite auch seit ungefähr 3-4 Monaten an einer Engine.
Ich teile die verschiedenen Subsysteme ebenfalls in DLLs auf.
Beispiel: Graphics, Math, Kernel, Support, MemoryManagement, usw.
Ich nutze auch ein Plugin System, um die Engine API unabhängig zu halten.
Jedes Plugin ist auch als DLL implementiert.

Abstrakte Klassen sind sehr sinnvoll, wenn man die Engine Plattform und API unabhängig programmieren will.
Zum Beispiel:
class IRenderer....
class CD3D9Renderer : public IRenderer ....
class COGLRenderer : public IRenderer ....

Bei Math sollte man davon jedoch kein gebrauch machen. Da durch virtuelle Methoden ein Performanceverlust durch die vtable unvermeidbar ist.
Das hat aber Dot auch schon erwähnt.

Ich nutze auch DLLs in anderen DLLs.

19

28.02.2005, 12:55

"Ich nutze auch DLLs in anderen DLLs."

bringt das keine probleme wenn du eine dll
austauschen willst.???
geht da nicht wieder ein stück unabhängigkeit verloren?

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

20

28.02.2005, 13:10

Zitat


... geht da nicht wieder ein stück unabhängigkeit verloren?


Kommt drauf an ob du die DLL explicit oder implizit lädst.

Ich lade die Engine DLLs implizit, damit ist natürlich eine Abhängigkeit da.
Aber ich sehe generell kein Problem darin. Ich wüsste auch keine Alternative dazu. Außer explizit zu laden.

Die Plugins lade ich hingegen explicit, daher habe ich keine Abhängigkeit, da die DLLs zur Laufzeit geladen werden. Ist ein Plugin nicht da, kümmert sich die Engine nicht darum. Würde ich ein Plugin löschen, dann müsste ich nichts in der Engine ändern. Das ist ja auch der Sinn von Plugins.

Werbeanzeige