Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Operatoröverlagring i C++ operator&&

Postades av 2007-08-12 15:51:20 - Jan Ljungkvist, i forum c++, Tråden har 7 Kommentarer och lästs av 2356 personer

Hej!

Är det någon som har gjort detta förut och kan tala om för mig vad jag gör för fel?
Jag har i klienten :

if( b && c && a)

och ska kunna ha hur många operander som helst, men jag kan bara använda två, för om jag använder fler så får jag detta felmeddelande:

error C2677: binary '&&' : no global operator found which takes type 'Boolean' (or there is no acceptable conversion)

Jag hat testat många varianter med inget fungerar. Hoppas att någon har någon ide :)

Mvh
/Jan

******** Min cpp-fil *********************************************

bool Boolean::operator&&(const Boolean& rhs)const
{

if(*truth_value == TRUE && *rhs.truth_value == TRUE)
{
return true;
}
return false;
}

******** Min h-fil *********************************************
class Boolean
{

public:

enum TruthValue {FALSE, TRUE};

Boolean(TruthValue tv); //Konstruktor

Boolean (bool value); //Konstruktor
Boolean(const Boolean& src); //Copy-konstruktor
virtual ~Boolean(); //Destruktor

bool Boolean::operator==(const Boolean& rhs)const;
bool Boolean::operator!=(const Boolean& rhs)const;
bool Boolean::operator!();
bool Boolean::operator&&(const Boolean& rhs)const;
bool Boolean::operator||(const Boolean& rhs)const;

private:

TruthValue* truth_value; //En TruthValue-pekare som heter truth_value som

};


Svara

Sv: Operatoröverlagring i C++ operator&&

Postades av 2007-08-12 17:13:01 - Niklas Jansson

Jag förstår inte riktigt poängen med att göra en ny boolean (det ser helt vansinnigt ut, i synnerhet att använda pekare...), men det finns två sätt.

Antingen ändrar du
bool Boolean::operator&&(const Boolean& rhs)const

till
Boolean Boolean::operator&&(const Boolean& rhs)const

Och då måste du även se till att kunna konvertera en Boolean till en bool (operator bool(), alltså).

Eller så gör du två nya &&-operationer.

bool Boolean::operator&&(bool rhs) const

och

bool operator&&(const Boolean &lhs, bool rhs) const


Svara

Sv:Operatoröverlagring i C++ operator&&

Postades av 2007-08-12 19:38:25 - Jan Ljungkvist

Hej Nicklas,

Tack för att du vill kolla på detta.

OK, om jag har:
bool operator&&(const Boolean &lhs, bool rhs) const
kan jag då jämföra låt oss säga fyra eller fem objekt med varandra?
Om jag fattat detta rätt så behandlar funktionen i detta läge tre objekt (det underförstådda, lhs samt rhs).

Hur skulle det se ut om jag skickar som retur en Boolean(i stället för en bool)som i fallet:
Boolean Boolean::operator&&(const Boolean& rhs)const?
Kan du ge ett exempel på vad du menar?

/Jan


Svara

Sv: Operatoröverlagring i C++ operator&&

Postades av 2007-08-12 20:21:38 - Niklas Jansson

Nej, operatorn tar inte tre argument. Koden tolkas som :

(A && B) && C
(Boolean && Boolean) && Boolean

Den tar alltså bara de två första först. Problemet är att din nuvarande &&-operator returnerar en bool.
Du får alltså efter X = A && B

X && C
bool && Boolean

men bool har ingen operator && som tar en Boolean. Problemet är att du inte kan ändra bool. Du får då skriva en separat, vanlig funktion (alltså ingen medlemsfunktion), säg (skrev lite fel innan)

bool operator&&(bool lhs, const Boolean &lhs)

En annan variant är att istället låra A && B bli en Boolean, genom att helt enkelt låta den returnera av den typen.

Då får du istället i fallet ovan
X && C = D
Boolean && Boolean

D
Boolean

Och &&-operationen kommer fungera. Sen måste det ju dock omvandlas till en bool igen, och då måste du se till att göra det automatiskt; via operator bool().

Fast varför gör du så här överhuvudtaget? Allting är märkligt med Boolean-klassen.


Svara

Sv:Operatoröverlagring i C++ operator&&

Postades av 2007-08-13 18:46:19 - Jan Ljungkvist

OK, om jag fattat detta rätt så kan man alltså göra så här:


Och att initieringen sätts till:
*****************************************************
Boolean a(Boolean::TRUE); // Här sätts värdet på a till TRUE.

Boolean b(Boolean::FALSE); // Här sätts värdet på b till FALSE.

Boolean c(Boolean::FALSE); // Här sätts värdet på c till FALSE.

*****************************************************

// I klienten skriver jag detta:

if( b && c && a)
cout"Skriv INTE detta"
else
cout"Skriv ut detta !"


*****************************************************
Boolean Boolean::operator&&(const Boolean& rhs)const
{
Boolean temp;

if(*truth_value == TRUE && *rhs.truth_value == TRUE)
{
*temp.truth_value == TRUE;
return temp;
}

*temp.truth_value == FALSE;
return temp;
}
*****************************************************
Jag får följande delmeddelande utan koden ovan.

error: conditional expression of type 'Boolean' is illegal
error: 'Boolean' : no appropriate default constructor available
warning: '==' : operator has no effect; did you intend '='?
warning: '==' : operator has no effect; did you intend '='?


operator bool() är det då en funktion som omvandlar ett truth_value som är TRUE eller FALSE till en bool som är true eller false? Hur kan implementationen på den ev. se ut?

Koden ska även passa ihop med om man t.ex. skriver bool c = true.
Det är ett problem som jag gärna skulle vilja få att funka, vitsen är också att få det hela att fungera med bool också.

/Jan



Svara

Sv: Operatoröverlagring i C++ operator&&

Postades av 2007-08-13 20:45:39 - Niklas Jansson

Det framgår inte riktigt vilka rader som felen syftar på.
Men conditional expression-grejen verkar ju iaf syfta på A && B && C.

Det är helt ok, precis som det ska vara, ur den operationen får du ut ett objekt av typen Boolean, vilket C++ inte kan omvandla till en bool. Vad du istället behöver är just en omvandling till bool, vilket är det operator bool gör.

Implementationen blir väl något i stil med:

Boolean::operator bool()
{
return *truth_value == TRUE;
}


Det andra felet tycks vara kopplat till

Boolean temp;

Antingen får du initera den med något, eller så får du skriva en defaultkonstruktor. Sistnämnda är nog att föredra.

<b>>Koden ska även passa ihop med om man t.ex. skriver bool c = true.
Det är ett problem som jag gärna skulle vilja få att funka, vitsen är också att få det hela att fungera med bool också.</b>
Det här förstår jag inte riktigt. Det skulle underlätta om du förklarar vad poägen med allt detta är, är det någon slags skoluppgift, gör du det för att lära dig själv?


Svara

Sv:Operatoröverlagring i C++ operator&&

Postades av 2007-08-15 17:45:53 - Jan Ljungkvist

Hejsan!

Tack Niclas för supporten, jag tror att jag är en lösning på väg :-)

Mvh
/Jan


Svara

Sv: Operatoröverlagring i C++ operator&&

Postades av 2007-10-07 14:41:50 - Simon Lindholm

Det är en dålig idé att överlagra operator&&. Eftersom det är en function evalueras båda argumenten, inte det vänstra först, osv, som man är van vid. En bättre idé är att omvandla till bool, eller ännu bättre, för att undvika t.ex.
varde+15 = true+15 = 16
, omvandling till en innerklass-pekare.
Men varför har du egentligen en klass Boolean? bool är bättre, eftersom det är en nativ typ (behöver inte definieras osv) och fås som resultat vid t.ex. 1==2.
Den ända rätta lösningen är:
typedef bool Boolean;

Simon


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
791
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies