C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Stilfrage: *& oder **

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Martin Heibel
Guest





PostPosted: Tue Sep 02, 2003 5:52 pm    Post subject: Re: Stilfrage: *& oder ** Reply with quote



Jan Boehme schrieb:

Quote:
Hallo!
Bei Funktionsparametern stellt sich des öfteren die Frage, welche der
beiden Varianten nun einzusetzen ist. Ich preferiere die Variante *&
Die stellt sich eigentlich nicht (dazu gab es vor Kurzem einen Thread).


Quote:
bool testFunc(Class* &_pObj)
{
// Zeiger umhängen
_pObj = ...;
}
Ok.


Quote:

Class* m_pObj=0;
if(testFunc(m_pObj))
m_pObj->jetztKannIch();

gegenüber dieser

testFunc(Class** _ppObj)
{
// Zeiger umhängen
*_ppObj = ...;
}
Nur dann ok, wenn _ppObj optional ist, sprich 0 sein kann.


Quote:

Class* m_pObj=0;
if(testFunc(&m_pObj))
m_pObj->jetztKannIch();

da sie meiner Meinung nach besser nachzuvollziehen ist.
Gibt es noch eine Möglichkeit, sowas zu machen und welche verwendet ihr?
Gar keine. Ich habe seit Jahren keine solchen Konstrukte mehr benutzt, weil

ich Pointer für genau zwei Zwecke benutze:

1. Optionale Funktionsparameter (extrem selten)
2. Für Beziehungen im weitesten Sinn. Dabei ist der Pointer ein Member in
einem Objekt, das die Kontrolle über ihn hat.

In beiden Fällen benötigt man keinen Pointer als 'out'-Parameter. Nach
meiner Erfahrung ist das eine der fragestellungen, die aus einem
Designfehler resultieren.

Wenn Du das Konstrukt benötigst, weil Dich existierender Code dazu zwingt,
dann empfehle ich eine der folgenden Varianten:

*auf die harte Tour*

Class* testFunc() throw(SomeException)
{ ... }

oder, wenn der aktuelle Zustand des Pointers relevant für die Funktion ist:

Class* testFunc(Class* p) throw(SomeException)
{ ... }

*Fehlertolerant*
(Nur wenn ein Verschleppen des Fehlers unkritisch ist)

class TestFunctor
{
public:
Class* operator() throw(); // evtl. mit Parameter
bool ok() const;
};


Gruß,
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Tue Sep 02, 2003 8:24 pm    Post subject: Re: Stilfrage: *& oder ** Reply with quote



Jan Boehme schrieb:
Quote:
Hallo!
Bei Funktionsparametern stellt sich des öfteren die Frage, welche der
beiden Varianten nun einzusetzen ist. Ich preferiere die Variante *&

bool testFunc(Class* &_pObj)
{
// Zeiger umhängen
_pObj = ...;
}

Das kann aber auch gewaltig nach hinten losgehen. Wenn wir einmal davon
ausgehen, dass ein unbedarfter diese Funktion verwendet, dann kann
folgendes ein fataler Fehler sein:

Class *instance = new Class;
testFunc( instance );

Grundsätzlich ist das kein Fehler. Aber was passiert, wenn _pObj
gespeichert oder (OT) in einem Thread weiter verarbeitet wird? Jeder
Zugriff nachdem instance, ein lokale Variable, zerstört wurde, greift
auf ungültige Daten zu. Man sollte sich daher bewusst machen, was man
bei einer solchen Funktion NICHT machen darf.
Ich erwähne das, weil ich vor kurzem eine Diskussion über die Verwendung
von *& hatte. Wie gesagt, solange man sich dessen bewusst ist, ist die
Verwendung kein Problem. Aber bitte darauf achten, dass es nicht falsch
verwendet wird oder ein Anfänger auf falsche Gedanken kommt!

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Christian Wimmer
Guest





PostPosted: Sun Sep 14, 2003 10:32 am    Post subject: Re: Stilfrage: *& oder ** Reply with quote



Am Tue, 02 Sep 2003 16:04:32 +0200 hat Jan Boehme <jb (AT) ype (DOT) de> geschrieben:
Quote:

Hallo!

Bei Funktionsparametern stellt sich des öfteren die Frage, welche der
beiden Varianten nun einzusetzen ist. Ich preferiere die Variante *&
bool testFunc(Class* &_pObj)
{
// Zeiger umhängen
_pObj = ...;
}
Class* m_pObj=0;
if(testFunc(m_pObj))
m_pObj->jetztKannIch();
gegenüber dieser
testFunc(Class** _ppObj)
{
// Zeiger umhängen
*_ppObj = ...;
}
Class* m_pObj=0;
if(testFunc(&m_pObj))
m_pObj->jetztKannIch();
da sie meiner Meinung nach besser nachzuvollziehen ist.
Gibt es noch eine Möglichkeit, sowas zu machen und welche verwendet ihr?
Grüße, Jan.
Quote:


** wird in C verwendet, weil der Referenzoperator & nicht existiert.

aber sonst ist es relativ egal - außer du programmierst in C.

da ich aber nur C++ programmiere verwende ich auch eher *&.
--
chris4y(at)gmx.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Werner Salomon
Guest





PostPosted: Mon Sep 15, 2003 12:57 pm    Post subject: Re: Stilfrage: *& oder ** Reply with quote

Jan Boehme <jb (AT) ype (DOT) de> wrote

Quote:
Hallo!
Bei Funktionsparametern stellt sich des öfteren die Frage, welche der
beiden Varianten nun einzusetzen ist. Ich preferiere die Variante *&

bool testFunc(Class* &_pObj)
{
// Zeiger umhängen
_pObj = ...;
}

Class* m_pObj=0;
if(testFunc(m_pObj))
m_pObj->jetztKannIch();

gegenüber dieser

testFunc(Class** _ppObj)
{
// Zeiger umhängen
*_ppObj = ...;
}

Class* m_pObj=0;
if(testFunc(&m_pObj))
m_pObj->jetztKannIch();

da sie meiner Meinung nach besser nachzuvollziehen ist.
Gibt es noch eine Möglichkeit, sowas zu machen und welche verwendet ihr?

Hallo Jan,

ich versuche grundsätzlich, das Ergebnis einer Funktion (oder Methode)
als Returncode zurück zu geben und eine evt. notwendige
Fehlerbehandlung über Exceptions zu machen.

Statt:
Class* m_pObj=0;
if(testFunc(&m_pObj)) // oder if(testFunc(m_pObj))
m_pObj->jetztKannIch();
geht dann einfacher
testFunc()->jetztKannIch();

bzw. i.A. muss der Pointer gemerkt - weil gelöscht - werden:
Class* m_pObj=testFunc();
m_pObj->jetztKannIch();

bzw. ich benutze auch Pointer selten, daher noch besser:
Smart_Ptr< Class > m_pObj( testFunc() );
m_pObj->jetztKannIch();

und wenn jetzt das 'testFunc()' selbst auch den Smart_Ptr liefert,
Smart_Ptr< Class > testFunc();
so kann ich tatsächlich ohne Memory-Leak schreiben:
testFunc()->jetztKannIch(); // s.o.

und selbst wenn m_pObj bereits belegt ist, oder auch nicht, ist
folgendes eine sichere Sache:
Smart_Ptr< Class > m_pObj;
m_pObj = .. // ??
// später
m_pObj = testFunc(); // ist sicher !
... egal ob der Smart-Pointer vorher bereits auf ein Objekt zeigt oder
nicht.

Wenn's dann doch mal sein muss, Pointer als variablen Parameter zu
übergeben, dann bevorzuge ich:
typedef Class* ClassPtr;
bool testFunc( ClassPtr& _pObj ) {
// Zeiger umhängen
_pObj = ...;
}

... das ist für mich einfach C++-Stil. Warum das 'besser' ist, haben
die anderen ja schon gesagt.

Gruß
Werner

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.