operator== i en abstrakt klass?? (c++)

Permalänk
Medlem

operator== i en abstrakt klass?? (c++)

Jag försöker göra en klass Julian som ärver den abstrakta klassen Date. I Date vill jag implementera jämförelse-operatorn (==) som ska kunna jämföra alla klasser som ärver Date.

Men den vill inte kompilera, vad gör jag för fel?
Går det kanske inte att implementera operator== i en abstrakt klass?

date.h

class Date{ public: virtual int getDate() const=0; friend bool operator==(const Date & d1, const Date & d2); };

date.cpp

#include "date.h" bool Date::operator==(const Date & d1, const Date & d2){ return d1.getDate()==d2.getDate(); }

julian.h

#include "date.h" class Julian : public Date{ private: int uDate; public: Julian(int yyyy); int getDate() const; };

julian.cpp

#include "julian.h" Julian::Julian(int yyyy){ uDate=yyyy; } int Julian::getDate() const{ return uDate; }

main.cpp

#include "julian.cpp" #include <iostream> int main(){ Julian j1(22); Julian j2(11); std::cout<<(j1==j2)<<std::endl; }

Permalänk
Medlem

Du har deklarerat "friend bool operator ==" som pure, vad ska det betyda? Troligtvis menar du "friend bool operator==(const Date & d1, const Date & d2) { return d1.getDate()==d2.getDate(); }"

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots
🎸 Musik

Permalänk
Medlem

Du går möjligtvis inte kursen programsystemkonstruktion i c++ på kth? Håller nämnligen på med samma uppgift.

Permalänk
Medlem

Vill du att operator== ska vara medlem eller global? Du kan inte göra den till både en friend och pure virtual. I det första fallet, ta bort friend. I det andra fallet, ta bort =0 och skriv inte Date:: framför funktionen när du definierar den.

Visa signatur

:€

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av eighty
Vill du att operator== ska vara medlem eller global? Du kan inte göra den till både en friend och pure virtual. I det första fallet, ta bort friend. I det andra fallet, ta bort =0 och skriv inte Date:: framför funktionen när du definierar den.

Citat:

Ursprungligen inskrivet av Sunray
Du har deklarerat "friend bool operator ==" som pure, vad ska det betyda? Troligtvis menar du "friend bool operator==(const Date & d1, const Date & d2) { return d1.getDate()==d2.getDate(); }"

Ojdå klantigt, =0 ska inte vara där, den ska alltså inte vara abstrakt.

Jag får det att funka när jag, som ni säger, istället implementerar operator== i h-filen så här:

class Date { public: virtual int getDate() const=0; friend bool operator==(const Date & d1, const Date & d2){ return d1.getDate()==d2.getDate(); } };

Det förstår jag inte. Varför kan jag inte dela upp det som jag gjorde tidigare i en h-fil och en cpp-fil?

Citat:

Ursprungligen inskrivet av Krabban
Du går möjligtvis inte kursen programsystemkonstruktion i c++ på kth? Håller nämnligen på med samma uppgift.

Japp

Permalänk
Medlem

Varför har du den som friend när den inte använder något privat från Date?

bool operator==(const Date& d1, const Date& d2) { return d1.getDate() == d2.getDate(); }

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ereinion
Varför har du den som friend när den inte använder något privat från Date?

Sant, det är ju onödigt :)...

Permalänk
Medlem

Ja, varför har du den som friend när du kan ha den som en del av klassen?
Överlagrade operatorer ärvs ju också.

bool Date:: operator ==(const Date& other){ return (getDate() == other.getDate()); }

Edit: fan vad jag hatar att även kod omvandlas till smileys... i koden ovan får du ta bort mellanrummet mellan :: och "operator"...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Osaou
i koden ovan får du ta bort mellanrummet mellan :: och "operator"...

Det behövs inte.

Visa signatur

:€

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Osaou
Ja, varför har du den som friend när du kan ha den som en del av klassen?
Överlagrade operatorer ärvs ju också.

bool Date:: operator ==(const Date& other){ return (getDate() == other.getDate()); }

Hur menar du, kan jag implementera i date.cpp ändå?
Såhär har jag skrivit nu, men det funkar inte...

date.h:

class Date{ public: virtual int getDate() const=0; bool operator==(const Date & d2); };

date.cpp:

#include "date.h" bool Date::operator==(const Date & d2){ return getDate()==d2.getDate(); }

julian.cpp, julain.h, main.cpp som i första posten

Permalänk
Medlem

Japp, det ska funka bra... anledningen till att det inte funkar måste ligga nån annan stans.
Ska skriva en liknande själv och kolla lite...

Edit:
Okej, eftersom du inte postar nån mer kod kan jag inte felsöka din, men detta funkar finfint för mig:

Date.h: class Date{ public: virtual int getDate() const = 0; bool operator==(const Date & d2); }; Date.cpp: #include "date.h" bool Date:: operator==(const Date &d2){ return (getDate() == d2.getDate()); } Julian.h: class Julian : public Date{ private: int uDate; public: Julian(int yyyy); int getDate() const; }; Julian.cpp: #include "julian.h" Julian::Julian(int yyyy){ uDate = yyyy; } int Julian::getDate() const{ return uDate; } Main.cpp: #include <iostream> #include "date.cpp" #include "julian.cpp" int main(void){ Julian j1(22); Julian j2(11); Julian j3(22); std::cout << "comparison of j1(22) & j2(11) returns: " << (j1 == j2) << std::endl; std::cout << "comparison of j1(22) & j3(22) returns: " << (j1 == j3) << std::endl; }

Permalänk
Medlem

Om du har operator== som medlemsfunktion, vilket det i det här fallet inte finns någon anledning till, så bör funktionen vara const Bara att bocka i "Inga smilies, tack" så slipper du problem med koden.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Osaou
Japp, det ska funka bra... anledningen till att det inte funkar måste ligga nån annan stans.
Ska skriva en liknande själv och kolla lite...

Edit:
Okej, eftersom du inte postar nån mer kod kan jag inte felsöka din, men detta funkar finfint för mig:

Jag hade bara glömt att inkludera både date.cpp och julian.cpp.
Nu fungerare det. Tack för hjälpen!

Permalänk
Medlem

Du ska inte behöva inkludera .cpp-filer. Aldrig.

// date.h #ifndef _DATE_H_ #define _DATE_H_ class Date { public: virtual int getDate() const = 0; }; bool operator==(const Date& d1, const Date& d2); #endif // date.cpp #include "date.h" bool operator==(const Date& d1, const Date& d2) { return d1.getDate() == d2.getDate(); } // julian.h #include "date.h" #ifndef _JULIAN_H_ #define _JULIAN_H_ class Julian : public Date { int date; public: Julian(int yyyy); int getDate() const; }; #endif // julian.cpp #include "julian.h" Julian::Julian(int yyyy) : date(yyyy) {} int Julian::getDate() const { return date; } // main.cpp #include <iostream> #include "julian.h" int main() { Julian j1(22); Julian j2(11); Julian j3(22); std::cout << "comparison of j1(22) & j2(11) returns: " << (j1 == j2) << std::endl; std::cout << "comparison of j1(22) & j3(22) returns: " << (j1 == j3) << std::endl; }

Meningen är att man inte ska behöva inkludera .cpp-filer utan bara .h.

Permalänk
Medlem

Helt lugnt.
måste bara fråga, hur var uppgiften forumlerad? Och hur långt har ni kommit i kursen?
Blir nyfiken i allmänhet då jag funderar på att söka till KTH nästa höst...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ereinion
Du ska inte behöva inkludera .cpp-filer. Aldrig.
Meningen är att man inte ska behöva inkludera .cpp-filer utan bara .h.

Låter vettigt, men jag får ändå inte din kod att kompilera om jag inte inkluderar cpp-filerna.

Så här säger den:

$ g++ -o julian main.cpp /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0x96):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xa9):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xbc):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xce):main.cpp: undefined reference to `operator==(Date const&, Date const&)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0x113):main.cpp: undefined reference t o `operator==(Date const&, Date const&)' collect2: ld returned 1 exit status

Citat:

Ursprungligen inskrivet av Osaou
Helt lugnt.
måste bara fråga, hur var uppgiften forumlerad? Och hur långt har ni kommit i kursen?
Blir nyfiken i allmänhet då jag funderar på att söka till KTH nästa höst...

Här har du uppgiften (2.2)
http://w1.nada.kth.se/kurser/kth/2D1387/cprog04/labbar/lab2.p...

Har väl gjort kanske 1/4 i labbdelen av kursen skulle jag gissa...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ptolemy
Låter vettigt, men jag får ändå inte din kod att kompilera om jag inte inkluderar cpp-filerna.

Så här säger den:

$ g++ -o julian main.cpp /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0x96):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xa9):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xbc):main.cpp: undefined reference to `Julian::Julian[in-charge](int)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0xce):main.cpp: undefined reference to `operator==(Date const&, Date const&)' /cygdrive/c/WINDOWS/TEMP/ccfYLnZ1.o(.text+0x113):main.cpp: undefined reference t o `operator==(Date const&, Date const&)' collect2: ld returned 1 exit status

Heh, så går det när man använder GCC (för det är väl det du använder) Funkar finfint i msvc 7.1

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ereinion

// date.h #ifndef _DATE_H_ #define _DATE_H_ class Date { public: virtual int getDate() const = 0; }; bool operator==(const Date& d1, const Date& d2); #endif

Varför lägger man operator== utanför klassdeklarationen? Det verkar konstigt?

Permalänk
Medlem

Du kan ha den i klassen också, men får du ta bort en parameter för this räknas som den ena instansen som ska jämföras. Varför verkar det konstigt? Största anledningen till att lägga den i klassen är om den ska ha tillgång till något privat eller skyddat, annars funkar den lika bra utanför klassen.

Permalänk
Medlem

Aha. ok då förstår jag.