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: Wie gebe ich was bei operator+ zurück?

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





PostPosted: Mon Sep 08, 2003 9:30 pm    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote



Christoph Jerolimov <jerolimov (AT) gmx (DOT) de> wrote in news:3f5cd702$1
@news.ginko.net:

Quote:
Mein Problem ist die Methode *cxInt& cxInt::operator+ (int value)*, hier
erstelle ich ja eine neue Instanz vom Typ cxInt und diese ist ja
eigendlich nach dem Beenden der jeweiligen Methode wieder ungültig,
genau das sagt mir auch meine IDE (Dev-C++): [WARNING] reference to
local variable 'result' returned.

Wie macht man das sonst, kann mir das vielleicht wer verraten. Wink

Keine reference zurückgeben. Also
cxInt operator+ (int rval);

mfg
--
http://xrxixpx.rip-productions.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
Jan Langer
Guest





PostPosted: Mon Sep 08, 2003 9:38 pm    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote



Christoph Jerolimov wrote:
Quote:
class cxInt {
private:
int m_value;

public:
cxInt ();
cxInt (const int value);
cxInt (const char *value);
cxInt (const char *value, const int length);
cxInt (const cxInt &value);

cxInt& operator+ (int value);

int getIntValue();
};

....

Mein Problem ist die Methode *cxInt& cxInt::operator+ (int value)*, hier
erstelle ich ja eine neue Instanz vom Typ cxInt und diese ist ja
eigendlich nach dem Beenden der jeweiligen Methode wieder ungültig,
genau das sagt mir auch meine IDE (Dev-C++): [WARNING] reference to
local variable 'result' returned.

Wie macht man das sonst, kann mir das vielleicht wer verraten. Wink

nabend,
indem du ganz einfach keine referenz zurueckgibst. also einfach
cxInt operator + (int value);

noch besser waere es bestimmt, wenn du den operator ausserhalb der
klasse deklarierst und seine argumente zu cxInt wandelst.
cxInt operator + (cxInt lhs, cxInt rhs);

da funktioniert dann auch
cxInt a = 0;
cxInt b = 17 + a;
cxInt c = a + 3;
cxInt d = b + c;

jan

--
jan langer ... [email]jan (AT) langernetz (DOT) de[/email]
"pi ist genau drei"

--
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 09, 2003 5:56 am    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote



Quote:
nabend,
indem du ganz einfach keine referenz zurueckgibst. also einfach
cxInt operator + (int value);


Da dein Operator praktisch nichts an deiner Klasse ändert, sondern nur
einen temporären Zwischenwert zurück gibt, kannst du die Methode auch
als const deklarieren:

cxInt operator + (int value) const;

Damit verhält sich der operator konform zu anderen +-operatoren.

Greuß 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
Christoph Rabel
Guest





PostPosted: Tue Sep 09, 2003 9:21 am    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote

Christoph Jerolimov wrote:
Quote:
Jan Langer wrote:

indem du ganz einfach keine referenz zurueckgibst. also einfach
cxInt operator + (int value);

So eine Funktion habe ich ja auch, ich würde aber gerne auch zusätzlich
das Objekte vom Typ cxInt addieren:

Der beste Weg das zu lösen ist so:

cxInt operator+ (cxInt const& left, cxInt const& right)
{
cxInt tmp(left);
return tmp += right;
}

Beachte das dieser Operator kein member der Klasse ist.

Quote:
Kann es sein das evtl. sogar so schon klappt, immerhin kommt ja zur
laufzeit kein Speicher-Fehler oder sonst was.

Vielleicht wird die Instanze erst nach dem abarbeiten des kompletten
Befehls automatisch gelöscht? Oder gar nicht??

Könntest du die Frage umformulieren, worauf willst du hinaus?

Falls du meinst, das es trotz der Referenz als Rückgabewert klappt, so
muss ich dich enttäuschen. Du es funktioniert ist nur "Zufall".

mfg

Christoph

--
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
Christoph Rabel
Guest





PostPosted: Tue Sep 09, 2003 9:38 am    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote

Christoph Jerolimov wrote:
Quote:
--------------------- TEST VON CXINT ---------------------
--------------------------- CXINT.H ---------------------------
#ifndef CX_INT
#define CX_INT

class cxInt {
private:
int m_value;

public:
cxInt ();
cxInt (const int value);

Das const ist hier nicht nötig, du kannst es weglassen. Ausserdem kannst
du die beiden Konstruktoren zu einem zusammenfassen:

cxInt (int value = 0);

Quote:
cxInt (const char *value);
cxInt (const char *value, const int length);

Hier auch (das hintere ist gemeint)

Quote:
cxInt (const cxInt &value);

cxInt& operator+ (int value);

Wurde ja schon kommentiert.

Ich würde diesen Operator komplett weglassen und stattdessen einen Operator:

cxInt& operator+ (cxInt const& value)
{
m_value += value.m_value;
return *this;
}

schreiben.

Und ausserhalb der Klasse den im anderen Posting angesprochenen
operator+. int kann automatisch in cxInt konvertiert werden, daher
sollten diese beiden genügen.

Quote:
int getIntValue();
int getIntValue() const;


Quote:
---------------------------- CXINT.CPP -------------------------
#include <iostream
#include

#include
Quote:
#include "cxint.h"

cxInt::cxInt() {
m_value = 0;
}

cxInt::cxInt(const int value) {
m_value = value;
}

Besser mit der Initialisierungsliste arbeiten:

cxInt::cxInt(const int value) : m_value(value)
{ }

Hat diverse Vorteile, ist effizienter(nur bei eigenen Typen) und du
kannst auch Konstanten initialisieren.

Quote:
cxInt::cxInt (const char *value) {

Ich würde hier zumindest ein

assert(value);

einbauen damit ich keinen Nullpointer übergeben bekommen (k.A. ob atoi
damit umgehen kann, ist mir auch egal)

Noch besser wäre:

if (!value)
m_value = 0;
else
Quote:
m_value = atoi(value);
}

Eventuell würde ich sogar beides machen oder eine Exception werfen.

Die beste Lösung ist meiner Meinung nach den ganzen Konstruktor
wegzulassen. Soll doch der Aufrufer den char* konvertieren.

Quote:
cxInt::cxInt (const char *value, const int length) {
m_value = 0;
}

cxInt::cxInt (const cxInt &value) {

}

Ich nehme an, diese beiden hast du einfach noch nicht implementiert.

mfg

Christoph

--
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 09, 2003 11:08 am    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote

Quote:
// externe Operatoren

cxint
operator+ (const cxint& lhs, const cxint& rhs) {
cxint result;
// Implementation
return result;
}


Welchen Vorteil hat es eigentlich, diesen Operator als extern du
deklarieren? Konkret auf den obigen Fall bezogen sehe ich keinen
Unterschied zu einem Operator innerhalb der Klasse. Auch dann nicht,
wenn die Operanden vertauscht werden.
Spricht etwas dagegen, ihn intern zu halten?

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
Kostka, Volkmar
Guest





PostPosted: Tue Sep 09, 2003 11:16 am    Post subject: Re: Wie gebe ich was bei operator+ zurück? Reply with quote


Hallo,

Markus Breuer wrote:
Quote:
// externe Operatoren

cxint
operator+ (const cxint& lhs, const cxint& rhs) {
cxint result;
// Implementation
return result;
}



Welchen Vorteil hat es eigentlich, diesen Operator als extern du
deklarieren? Konkret auf den obigen Fall bezogen sehe ich keinen
Unterschied zu einem Operator innerhalb der Klasse. Auch dann nicht,
wenn die Operanden vertauscht werden.
Spricht etwas dagegen, ihn intern zu halten?

Ja.

cxint ci = 5 + cxint(4);

Der Compiler sucht hier nach einem Operator, der einen int und einen
cxint addieren kann. Intern kannst du nur einen definieren, der einen
int zu einem cxint addiren kann, aber nicht umgekehrt,
bei einem internen Operator ist immer der Typ des linken Operanden durch
die Klasse festgelegt. Nur der rechte Typ kann frei gewaehlt werden.
Bei einem externen koennen beide Typen frei (zumindestens fast) gewaehlt
werden, da dann auch implizite Konvertierungen geprueft werden.

HTH

MFG

Volkmar Kostka

--
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.