"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?