Forum: C++, Något som spökar?

Forum huvudsida -> Programmering -> C++, Något som spökar?

Sidor: 1

Till botten

olle 15:43 - 15:e Augusti 2006 | Post #1
Medlem
Inlägg: 57


Skicka PM
Tänkte passa på och fråga om nåt annat när jag andå inte fått svar från min förra inlägg. Om det går bra Smiley

Har en generisk find funktion som jag gjort. Där den retunerar Cref<Object>. Tanken är den att om sökningen misslyckas så ska den retunerar en NULL pekare. Annars resultatet.

Skapade en Person objekt och matade in olika personnumer där jag sen försöker hitta en personnumer m.h.a find funktionen. Sen skriva ut personens inkomst.

Problemet är att jag får kompileringsfel när jag försöker skriva ut resultatet med hjälp av en get funktion i Cref klassen.

Koden

  1.  
  2. #include<iostream>
  3. #include<vector>
  4.  
  5. using namespace std;
  6.  
  7. template<class Object>
  8. class Cref{
  9. public:
  10. Cref() : obj(NULL){}
  11. explicit Cref(const Object &x ) : obj(&x) {}
  12. const Object &get() const{
  13. if( isNull() )
  14. throw "NULL";
  15. else return *obj;}
  16. bool isNull() const{ return obj==NULL; }
  17. private:
  18. const Object *obj;
  19. };
  20.  
  21.  
  22. template<class Object>
  23. Cref<Object> find3( const vector<Object> &v, const Object &x ) {
  24.  
  25. for ( int i=0; i<v.size();i++ ){
  26. if( v[i] == x )
  27. return Cref<Object>( v[i] );
  28. }
  29. return Cref<Object>();
  30. }
  31.  
  32. struct Person {
  33. Person() {}
  34. Person ( const char *nr, int ink=0 ) : inkomst(ink) { strcpy(pnr,nr); }
  35. bool operator==( const Person &rhs ) const { return strcmp( pnr, rhs.pnr ) == 0; }
  36. char pnr[12];
  37. int inkomst;
  38. };
  39.  
  40. int main(){
  41.  
  42. vector<Person> pv;
  43. pv.push_back( Person("134236-7890",98437) );
  44. pv.push_back( Person("694243-3852",39483) );
  45. pv.push_back( Person("156426-5833",65832) );
  46. pv.push_back( Person("810426-1953",67800) );
  47. pv.push_back( Person("420421-4965",39582) );
  48.  
  49.  
  50. Person person("810426-1953",67800 );
  51.  
  52. Cref<Person> c;
  53.  
  54. c=find3(pv,person);
  55.  
  56. if (c.isNull() )
  57. cout << "Personen du söker finns ej" << endl;
  58. else
  59. cout << c.get(); // klagar på detta?
  60.  
  61. return 0;
  62. }


En sak att nämna är att get funktionen retunerar adressen till en Object och i funktionen är det en pekare som retuneras. Tänkte kanske man måste ha speciell syntax när man försöker skriva ut (cout).

Testade och söka efter ett personnumer som ej fanns då skrev den ut "Personen du söker finns ej". Sökte jag efter personnunmer som fanns så skrev den inte ut något. ( fick då ta bort cout << v.get(); ).
Med andra ord så fungerar v.get() utan cout.


Detta får jag vid kompileringen:

2c.cpp: In function "int main()":
2c.cpp:61: error: no match for "operator<<" in "std::cout << c. Cref<Object>::get [with Object = Person]()"
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:67: anm: kandidater är: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:78: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:90: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:125: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:159: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/ostream.tcc:102: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/ostream:176: anm: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>:perator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]

...... och mycket mer



-------------------------
Ingen signatur!



Nissebosselasse 16:00 - 15:e Augusti 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Ett allmänt tips: jag kan förstå att du skriver sådana här metoder/funktioner i inlärningssyfte, men annars: använd STL-biblioteket (det finns redan massvis av generella sökfunktioner - std::find t.ex.).
Det spar dig huvudvärken, och de är garanterade att fungera.

Nu ska jag fortsätta jobba!

-------------------------
http://pushingcows.se
Gula Nallen



olle 17:41 - 15:e Augusti 2006 | Post #3
Medlem
Inlägg: 57


Skicka PM
Anledningen till att jag har egen find funktion är att jag håller på gå igenom en gammal tenta. Där uppgifter går ut på att man ska använda denna.

Har en kurs efter mig som jag tänkte fixa. Hoppas jag inte varit till besvär eller nåt..

Ville främst se hur Cref fungerar. Hade den som bilaga där man skulle använda den för och lösa uppgiften. Skrev ner koden för och försökte se hur man gör i main(). dvs hur man använder det rent sagt.


-------------------------
Ingen signatur!

Senast redigerad 17:43 - 15:e Augusti 2006


Nissebosselasse 17:47 - 15:e Augusti 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM

Har en kurs efter mig som jag tänkte fixa. Hoppas jag inte varit till besvär eller nåt..

Som jag skrev, att skriva egna funktioner i syfte att lära sig är helt förståeligt. Jag ber om ursäkt om jag fick det att låta som en grinig gammal gubbe som pekar med käppen och svär... Smiley

Ska kolla genom koden när jag kommer hem. Dom har inte Visual Studio här på labbet...va konstigt...

-------------------------
http://pushingcows.se
Gula Nallen



olle 17:54 - 15:e Augusti 2006 | Post #5
Medlem
Inlägg: 57


Skicka PM
Det är lungt. behöver inte be om ursäkt eller så..Förstår tanken med att man använder STL så mycket man kan så man slipper detta.

Lite skumt om nu tex min find funktion är fel. Då kan man säga att läraren behöver läsa en kurs själv Smiley

Tack iallfall att du orkar kolla koden sen

ha de gött i jobbet

-------------------------
Ingen signatur!



olle 22:37 - 15:e Augusti 2006 | Post #6
Medlem
Inlägg: 57


Skicka PM
En annan gav mig tipsen och överlagra operator<< i min Person-struct. Frågan är om det löser allt eller om de finns nåt mer. Ska se om jag kan skriva den funktionen. ,,r lite osäker dock...

Kanske börjar bli sent, får nog ta det imorgon.

-------------------------
Ingen signatur!



Nissebosselasse 22:40 - 15:e Augusti 2006 | Post #7
Medlem
Inlägg: 490


Skicka PM
Okej, kollat igenom det nu. För egna objekt (klasser, strukturer), måste du överlagra << och tala om för std::cout hur den ska skriva ut objektet.
För om du tänker efter; hur vet std::cout vad en Person är? Vad i Person-strukturen är det den ska skriva ut? Det är detta du själv måste lägga in.

Det enda jag ändrade i koden var i strukturen Person:
  1. struct Person {
  2. Person() {}
  3. Person (const char *nr, int ink=0 ) : inkomst(ink)
  4. {
  5. strcpy (pnr, nr);
  6. }
  7. bool operator== ( const Person &rhs ) const {
  8. return strcmp( pnr, rhs.pnr ) == 0;
  9. }
  10. /* Tillagt */
  11. friend ostream& operator<< (ostream& os, const Person& p)
  12. {
  13. os << p.pnr << " (inkomst: " << p.inkomst << " kr)" << endl;
  14. return os;
  15. }
  16. /**********************************/
  17. char pnr[12];
  18. int inkomst;
  19. };


På det här sättet kan du dirigera en Person-struktur till vilken ström (av typen std::ostream, som cout är) som helst, eftersom strömmen nu har något att anropa.

Jag för övrigt rekommendera Bruce Eckels bok (fånigt efternamn han har förresten...) "Thinking in C++ 2nd ed Volume 2", som jag länkat till i en annan tråd, där bland annat ett kapitel ägnas åt just detta.

EDIT: här är länken till böckerna (eh, forumlänk, men jaja) http://www.blinkenlights.se/?p=readtopic&topicid=676

-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 22:53 - 15:e Augusti 2006


olle 23:50 - 15:e Augusti 2006 | Post #8
Medlem
Inlägg: 57


Skicka PM
Tack för hjälpen. Nu fungerar koden som den ska.
Ska kolla i boken, verkar som det är en bra bok.

Jag som tänkte sova för ett tag sen Smiley

Godnatt nu iallfall

-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> C++, Något som spökar?
Atom feed

Du får inte posta i den här tråden | Till toppen