/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Hvordan overloader jeg = = operatoren som~
Fra : Carsten Schwartz


Dato : 27-06-01 09:00

Jar har prøvet dette:

bool CString:erator= = (CString &csString)
{
return (0 == CompareNoCase((char *)csString));
}

Men det opfører sig mærkeligt, = = bliver nøærmest ignoreret når jeg
bruger det...

Nogen foreslag til den korrekte møde at overloade?



 
 
Kaspar Daugaard (27-06-2001)
Kommentar
Fra : Kaspar Daugaard


Dato : 27-06-01 10:21

"Carsten Schwartz" <csn@dont.spam.cotas.dk> wrote in message
news:9hc3u8$dav$1@news.inet.tele.dk...
> Jar har prøvet dette:
>
> bool CString:erator= = (CString &csString)
> {
> return (0 == CompareNoCase((char *)csString));
> }
>
> Men det opfører sig mærkeligt, = = bliver nøærmest ignoreret når jeg
> bruger det...
>
> Nogen foreslag til den korrekte møde at overloade?

Jeg er ikke sikker på at det vil hjælpe med problemet, men her er et par
kommentarer: Det vil nok være en god ting at gøre operator==() const sammen
med dens parameter. C-style cast til non-const char* bekymrer mig lidt, det
er normalt at foretrække med en GetCharPointer() fremfor implicit
konvertering.

Mht. hvorfor det ikke virker, er du så sikker på at CompareNoCase() og
konverteringsoperatoren til char* gør det de skal? Alt efter hvilket
udviklingsmiljø du bruger, burde du kunne bygge en debug-version og steppe
igennem koden linie for linie.

- Kaspar



Rasmus Christensen (27-06-2001)
Kommentar
Fra : Rasmus Christensen


Dato : 27-06-01 20:04

Hvordan ser din definition af klassen CString ud?

/Rasmus



Carsten Schwartz (28-06-2001)
Kommentar
Fra : Carsten Schwartz


Dato : 28-06-01 12:07

"Rasmus Christensen" <riverwind@mail.tele.dk> wrote in message
news:Q6q_6.248$It4.11049@news.get2net.dk...
> Hvordan ser din definition af klassen CString ud?
Sådan:

class CString;

// CString class definition
class CString : public CObject
{
// functions
public:
void SetAt(int iIndex, char ch);
void TrimRight();
void TrimLeft();
CString Mid(int iFirst);
CString Mid(int iFirst, int iCount);
int CompareNoCase(char * pchString);
bool IsEmpty();

void DefaultContruct();
CString();
CString(char * pchStr);
CString(const CString &csString);
~CString();

int Find (char* szSub, int nStart);
int Find (char* szSub);
int GetLength (void);
int Remove (char chRemove);
void Format (char* szFormat,
...);
char GetAt (int nIndex);
void Insert (int nIndex, char* szString);
void operator= (char* szString);
const CString& operator=(const CString& stringSrc);

void operator+= (char* szString);
void operator+= (char chChar);
operator char* (void) const;
bool operator== (const CString &csString);

private:
void Realloc (int nSize);
int GetChCount (char* szStr, char ch);

// data
private:
char* m_pchData; // Data buffer to hold string
int m_nSize; // Total buffer size used to hold data is always > the
length of the string
// NB! GetLength returns the length of the string
'strlen(m_pchData)'
protected:
};

>
> /Rasmus
>
>



Igor V. Rafienko (28-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 28-06-01 12:41

* Carsten Schwartz

[snip kode]

> bool operator== (const CString &csString);


Jeg tror ikke du vil gjøre dette, da operasjonen ikke vil være
symmetrisk: du vil kunne sammenligne en CString med "foo" og en
CString med en CString men ikke "foo" med en CString. Men det er nå
så... Jeg kan ikke se noe galt (annet enn att 'const' mangler i
definisjonen av CString (jeg tror ikke det er lurt å ha forskjeller
mellom deklarasjoner og definisjoner). I dette testeksempelet:


struct CString
{
CString( const char *data ){}
CString( ){}

bool operator== (const CString &csString) {
   std::cerr << "op==() called\n";
   return true;
}
};


int
main( int argc, char *argv[] )
{

CString s1, s2;

if ( s1 == "foo" )
   std::cerr << "flabba\n";
if ( s2 == s2 )
   std::cerr << "flabba2\n";
}


fungerer ting slik man forventer:

$ ./a.out
op==() called
flabba
op==() called
flabba2
$


Kanskje feilen ligger et annet sted? Er du sikker på at du lager
CString objekter og at det er nettopp slike som sammenlignes (du har
fx. et implisitt typecast til char*, hvilket er _svært_ uheldig[+]
(også fordi den kan gjøres for const objekter)).





ivr
[+] jeg prøvde nettopp å leke litt med ctor'ne og op==(), og det ser
ut som at noen kompilatorer kan tvinges til å sammenligne en "foo" med
en CString på en veldig interessant måte (nei, neppe slik en egentlig
vil ha).
--
My last almost girlfriend told me, in no uncompromising terms, it is
either she or C++, and I had to make a decision. Last night I upgraded
my compiler.
Mike from [news:comp.lang.c++]

Igor V. Rafienko (28-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 28-06-01 12:51

* Carsten Schwartz

[snip kode]

> bool operator== (const CString &csString);


Jeg tror ikke du vil gjøre dette, da operasjonen ikke vil være
symmetrisk: du vil kunne sammenligne en CString med "foo" og en
CString med en CString men ikke "foo" med en CString. Men det er nå
så... Jeg kan ikke se noe galt (annet enn att 'const' mangler i
definisjonen av op==() på argumentet (jeg tror ikke det er lurt å ha
forskjeller mellom deklarasjoner og definisjoner). I dette
testeksempelet:


struct CString
{
CString( const char *data ){}
CString( ){}

bool operator== (const CString &csString) {
   std::cerr << "op==() called\n";
   return true;
}
};


int
main( int argc, char *argv[] )
{

CString s1, s2;

if ( s1 == "foo" )
   std::cerr << "flabba\n";
if ( s2 == s2 )
   std::cerr << "flabba2\n";
}


fungerer ting slik man forventer:

$ ./a.out
op==() called
flabba
op==() called
flabba2
$


Kanskje feilen ligger et annet sted? Er du sikker på at du lager
CString objekter og at det er nettopp slike som sammenlignes (du har
fx. et implisitt typecast til char*, hvilket er _svært_ uheldig[+]
(også fordi den kan gjøres for const objekter)).





ivr
[+] jeg prøvde nettopp å leke litt med ctor'ne og op==(), og det ser
ut som at noen kompilatorer kan tvinges til å sammenligne en "foo" med
en CString på en veldig interessant måte (nei, neppe slik en egentlig
vil ha).
--
My last almost girlfriend told me, in no uncompromising terms, it is
either she or C++, and I had to make a decision. Last night I upgraded
my compiler.
Mike from [news:comp.lang.c++]

Carsten Schwartz (28-06-2001)
Kommentar
Fra : Carsten Schwartz


Dato : 28-06-01 14:17

Prøv at lave en metode der returnerer CString og sæt den == en CString
variable i en if sætning...

f.eks if ( MyClass.GetString() == csName)


"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjv4rt0ddqo.fsf@gjallarhorn.ifi.uio.no...
> * Carsten Schwartz
>
> [snip kode]
>
> > bool operator== (const CString &csString);
>
>
> Jeg tror ikke du vil gjøre dette, da operasjonen ikke vil være
> symmetrisk: du vil kunne sammenligne en CString med "foo" og en
> CString med en CString men ikke "foo" med en CString. Men det er nå
> så... Jeg kan ikke se noe galt (annet enn att 'const' mangler i
> definisjonen av op==() på argumentet (jeg tror ikke det er lurt å ha
> forskjeller mellom deklarasjoner og definisjoner). I dette
> testeksempelet:
>
>
> struct CString
> {
> CString( const char *data ){}
> CString( ){}
>
> bool operator== (const CString &csString) {
> std::cerr << "op==() called\n";
> return true;
> }
> };
>
>
> int
> main( int argc, char *argv[] )
> {
>
> CString s1, s2;
>
> if ( s1 == "foo" )
> std::cerr << "flabba\n";
> if ( s2 == s2 )
> std::cerr << "flabba2\n";
> }
>
>
> fungerer ting slik man forventer:
>
> $ ./a.out
> op==() called
> flabba
> op==() called
> flabba2
> $
>
>
> Kanskje feilen ligger et annet sted? Er du sikker på at du lager
> CString objekter og at det er nettopp slike som sammenlignes (du har
> fx. et implisitt typecast til char*, hvilket er _svært_ uheldig[+]
> (også fordi den kan gjøres for const objekter)).
>
>
>
>
>
> ivr
> [+] jeg prøvde nettopp å leke litt med ctor'ne og op==(), og det ser
> ut som at noen kompilatorer kan tvinges til å sammenligne en "foo" med
> en CString på en veldig interessant måte (nei, neppe slik en egentlig
> vil ha).
> --
> My last almost girlfriend told me, in no uncompromising terms, it is
> either she or C++, and I had to make a decision. Last night I upgraded
> my compiler.
> Mike from [news:comp.lang.c++]



Igor V. Rafienko (28-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 28-06-01 14:28

* Carsten Schwartz

> Prøv at lave en metode der returnerer CString og sæt den == en
> CString variable i en if sætning...


Fungerer fremdeles glimrende.

[snip]





ivr
--
Amy: Psst... look what life was like before genetic engeneering.
Leela: Those poor 20th century women...
-- Futurama, "Why must I be a Crustacean in love?"

Anders Melchiorsen (28-06-2001)
Kommentar
Fra : Anders Melchiorsen


Dato : 28-06-01 13:10

"Carsten Schwartz" <csn@dont.spam.cotas.dk> skrev den 27-Jun-01:

> Jar har prøvet dette:
>
> bool CString:erator= = (CString &csString)
> {
> return (0 == CompareNoCase((char *)csString));
> }
>
> Men det opfører sig mærkeligt, = = bliver nøærmest ignoreret når jeg
> bruger det...

Din "operator char*()" kan måske give nogle underlige tilfælde, hvor
du kommer til at sammenligne to char-pointere i stedet for to CString.
Hvis din compiler ikke advarer om dobbelttydigheden, men blot vælger
én af delene, kan det være årsagen.

Du skal endvidere være opmærksom på, at når operator== er
member-funktion, vil venstresiden ikke få konverteret type automatisk.


Et kort eksempel, som burde få din oversætter til at brokke sig over
dobbelttydigheden i sammenligningerne. Den første sammenligning ville
ikke give problemer (udover forkert resultat) hvis operator== var en
member-funktion:


#include <string.h>

class CS {
public:
   CS(char* a) { ptr = strdup(a); }
   operator const char*() { return ptr; }

private:
   char* ptr;
   friend bool operator ==(const CS& a, const CS& b);
};

bool operator ==(const CS& a, const CS& b)
{ return 0 == strcmp(a. ptr, b.ptr); }

int main()
{
   CS abc("abc");
   ("abc" == abc);
   (abc == "abc");
}



Det foreslås at lave din CString->char* konvertering eksplicit,
ligesom std::string::c_str() og i øvrigt returnere const char*, ikke
bare char*. Hvis det overhovedet er muligt, anbefales std::string.

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste