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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

21

10.06.2007, 05:29

Es spricht nichts dagegen, aber auch nichts dafür! ;-) Freie Funktionen sind deine Freunde sagt man ja. Zum Teil hat das den Sinn um mit einer Methode alle Operatoren des Typs und Kombination zu erschlagen zum anderen dient es der besseren Kapselung.
Beim Operator += (z.B.) ist es aber tatsächlich mehr oder weniger egal.
Manche Klassenmember lassen sich allerdings garnicht extern deklarieren (z.B. operator=).
Wie auch immer, im Prinzip ist es in dem Fall Geschmackssache.
@D13_Dreinig

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

22

19.06.2007, 22:26

Sorry das der Thread so verwahrlost ist.
Jetzt hab ich aber wieder Zeit hier zu schreiben und mir euer feedback durchzulesen.

Zitat von »"David_pb"«



Das Leck befindet sich u.A. im Copy C'tor. Fehlerchen gibts viele. Einige Beispiele:

FastStream.cpp

C-/C++-Quelltext

1
2
3
4
5
// Die Schnittstelle erzeugen

pDevice =   new IFastStreamDevice;

if(!pDevice)
    return 0;


Was ist falsch?
Seit der Operator new nie einen Nullpointer liefert (das war mal früher so) ist diese Abfrage total sinn- und zwecklos. Der Operator new wirfst eine Exception vom Typ std::bad_alloc wenn der Speicher nicht reserviert werden konnte.

Lösung:

C-/C++-Quelltext

1
2
3
4
pDevice = new ( std::nothrow ) IFastStreamDevice;

if ( !pDevice )
  return 0;


Das wusste ich net. in meinem buch stand dass new im falle eines fehlers 0 zurückgibt. Hab das auch erst vor kurzem in einem anderen buch gelesen, dass es so ist, wie du sagst. Danke!


Zitat von »"David_pb"«


fsBuffer.h

C-/C++-Quelltext

1
template<typename T>class FASTSTREAM_API CBuffer : public CString


Was ist falsch?
Da CString ein Klassentemplate ist muss zwangsläufig ein Typ angegeben werden, es sei denn irgendwo wird CString als vollständige Klasse definiert oder Typendefiniert. Aber CString ist ja sowiso mysteriös.

Lösung:
Typ angeben.

Wie du vllt gemerkt hast ist die fsBuffer.h in der FastStream.h nicht mehr includiert und die fsBuffer.cpp auskommentiert.(Keine Ahnung, warum ich das noch mit ins archiv gepackt hab)

Zitat von »"David_pb"«


Überall wo Templates Exportiert werden

C-/C++-Quelltext

1
template< typename T > class FASTSTREAM_API XYZ ...


Was ist falsch?
Templates können nicht in die DLL exportiert werden. Siehe Erklärung oben.

Lösung:
Einfach nicht exportieren und den gesamten Quellcode bereitstellen.

hmm....

Zitat von »"David_pb"«


fsFile.h

C-/C++-Quelltext

1
template<typename T> void CloseHandleT(T **pValue)


Was ist falsch?
Nichts direkt, allerdings wäre ein Referenz auf einen Zeiger wesentlich schöner.

Lösung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template< typename T > void CloseHandleT( T*& pValue )
{
        if(!(pValue))
            return;

        ::CloseHandle(pValue);
        (pValue) = NULL;
}


Was soll ich sagen... geschmaksache...

Zitat von »"David_pb"«


Nahezu überall

C-/C++-Quelltext

1
2
3
4
5
irgendeinzeiger = NULL;

if ( irgendeinzeiger == NULL )

...


Was ist falsch?
Auch nichts direkt, aber ein Zeiger kann in C++ auf '0' getestet werden. NULL ist ein unnötiges Fragment aus C Zeiten und gehört nichtmal zum C++ Standard.

Lösung:
Statt NULL einfach 0 verwenden. Ist mehr C++! ;-)

Ich schreibe NULL nur der übersichtlichkeit halber.

Zitat von »"David_pb"«


fsFile.h und überall sonst

C-/C++-Quelltext

1
CFile(char *pcFileName, EFileEncoding Encoding = ANSI);


Was ist falsch?
Die Parameter mit dem Typ char* sollten egtl immer const char* sein.

Lösung:

C-/C++-Quelltext

1
CFile( const char* pcFileName, ... )


Warum denn eigentlich const char*?


Zitat von »"David_pb"«


An vielen, vielen Stellen

C-/C++-Quelltext

1
foo xyz() { return bar; }


Was ist falsch?
An vielen Stellen hält der Code die const correctness nicht ein.

Lösung:
Const Correctness einfach 100% einhalten. Dann wird evtl auch jemand diese Bibliothek verwenden. Code der sich nicht an die Const Correctness hält landet im Mülleimer.

Was meinst du damit?

Zitat von »"David_pb"«


fsString.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<typename T>void CString<T>::InitPtrs()
    {
        // Alle Zeiger auf NULL setzen

        m_pcString      =   NULL;
        m_pcOldString   =   NULL;

        ClearMem();
    }


Was ist falsch?
Memoryleak: ClearMem LÖSCHT beim Aufrufen von InitPtrs Nullpointer. Das macht zwar rein garnichts, aber der Speicher wird dennoch nicht freigegeben.

Lösung:
Erst speicher freigeben, dann Zeiger auf 0 setzen.

InitPtrs wird nur vom Konsturktor aufgerufen. Ist also egal, ob die Zeiger auf 0 sind oder net.(Ist noch ein überbleibsel aus schlechten Zeiten.

Zitat von »"David_pb"«


fsString.h

C-/C++-Quelltext

1
template<typename T>const void CString<T>::operator += (T *pcText)


Was ist falsch?
Der Operator += hat typischerweise eine vollkommen andere Signatur.

Lösung:

C-/C++-Quelltext

1
2
3
4
5
6
template< typename T >
CString< T >& operator+=( CString& str, T* pcText )
{
  str.AddString( pcText );
  return str;
}


Hmm er funktionier aber trotzdem^^
Danke, dass du mir so sehr gehlfen hast, und dir die mühe gemacht hast, nahezu den ganzen quellcode durchzulesen, es ist inzwischen ja schon nicht mehr wenig.

Leider habe ich die anderen beiträge noch net gelesen und konnte deshalb auch den anderen noch kein feedback geben.


Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

23

19.06.2007, 22:33

:arrow: Doppelpointer sind weniger Sicher als Referenz auf Pointer. Drum ist das nicht nur Geschmackssache.

:arrow: NULL ist aber nicht konform! :-P

:arrow: const char* weil der Zeiger auf eine konstante Zeichenkette zeigt die nicht geändert werden darf. => Undefiniertes Verhalten

:arrow: Google mal nach "const correctness"

:arrow: Dann ist es wenigstens ein potentielles Speicherloch. Auch nich besser.

:arrow: Sollte trotzdem nicht so implementiert werden.
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

24

19.06.2007, 23:44

Faule Socke

Korrekte Operatoren sollten zu folgendem in der Lage sein (auch wenn man es so extrem eigentlich nicht verwendet):

C-/C++-Quelltext

1
var1=var2+(var3+=var4+var5);


Du kannst ja versuchen, ob deine Operatoren da mitmachen, aber eigentlich kannst du dir den Versuch auch sparen ;)

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

25

21.06.2007, 10:38

ich würde den thread gerne ausdrucken, aber irgendwie find ich keine druckansicht(oder es gibt keine). Es sollten nämlich beide seiten ausgedruckt werden. Was kann ich tun?


Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

21.06.2007, 10:39

c&p in word und dann ausdrucken :P

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

27

21.06.2007, 10:57

Wenn wir schonmal beim thema operatoroverloading sind... wie überlade ich den ++ operator korrekt(jetzt net für die stringklasse, sondern für eine klasse für IP-Adressen(Network::CIP)?
Ich hab zwar dort schon einen operator überladen, allerdings kommt beim verwenden immer eine kompilerwarnung(Irgendwas mit post und prefix).
Der Operator ruft eigentlich nur die Methode Increment auf und gibt sich dann selbst zurück.

Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

21.06.2007, 10:59

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr330.htm

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

29

21.06.2007, 11:10

Genau das hab ich gesucht.

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

30

22.06.2007, 17:36

Hi,

ich habe jetzt einfach mal die Konstruktoren wie folgt angepasst:

C-/C++-Quelltext

1
2
3
4
5
CString();
CString(T *pcText);
CString(int iInt);
CString(float fFloat);
CString(CString &pOther);


Dann habe ich den Zuweisungsoperator wie folgt verändert:

C-/C++-Quelltext

1
virtual const CString<T>    &operator = (CString<T> *pRight);


Hier noch ein paar andere operatoren, die nun ausserhalb der Klasse sind:

C-/C++-Quelltext

1
2
3
4
template<typename T>const bool  operator == (CString<T> &pLeft, CString<T> &pRight);
template<typename T>const bool  operator != (CString<T> &pLeft, CString<T> &pRight);

template<typename T>const void  operator += (CString<T> &pLeft, CString<T> &pRight);


Wenn ich das ganze nun Kompiliere kommt folgende Fehlermeldung:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
z:\engines\faststream\include\fsMenu.h(53) : error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'char *' akzeptiert (oder keine geeignete Konvertierung möglich)
        z:\engines\faststream\include\fsString.h(82): kann 'const fs::String::CString<T> &fs::String::CString<T>::operator =(fs::String::CString<T> &)' sein
        with
        [
            T=char
        ]
        bei Anpassung der Argumentliste '(fs::String::CString<T>, char *)'
        with
        [
            T=char
        ]

Das ist nur ein Aussschnitt es kommen bei der Konfiguration "Debug" insgesamt 72 Fehler.

Hier mal das stückchen Code, das der Compiler bemängelt(Befindet sich in fs::Menu::CMenu/fsMenu.h):

C-/C++-Quelltext

1
void            SetName(char *pcName)                   {m_sName = pcName;}


Ich hab keine Ahnung, was ich noch machen könnte.
Kann mir jemand helfen?
Wenn ihr noch mehr Code oder Infos braucht, sagt es einfach.


mfg,

Faule Socke

Werbeanzeige