Avatar billede siul Nybegynder
13. april 2003 - 22:59 Der er 8 kommentarer og
1 løsning

Overloade << og >>

Hej,
Jeg har lavet en sequence class der bruger dynamic arrays.
Mit problem er hvordan jeg overloader << >>, saaledes at jeg kan bruge cout og cin i min .cpp file. Jeg har pasted min class definition (haaber det er nok, ellers paster jeg ogsaa funktionerne)og har ogsaa indsat mit gaet for prototyper for << >>, hvilket er foelgende:
istream& operator >>( istream& ins, sequence& target);
ostream& operator <<( ostream& outs, sequence& display);

Men er der en der kan hjaelpe mig med implmentionen af de to funktioner, saaledes at jeg kan bruge min cout og cin i cpp i filen.

Paa forhaand tak!

//****************************************************
#ifndef TESTSEQUENCE_H
#define TESTSEQUENCE_H
#include <stdlib.h> 
    class sequence
    {
    public:
        // TYPEDEFS and MEMBER CONSTANTS
        typedef double value_type;
        typedef size_t size_type;
        enum {DEFAULT_CAPACITY = 30};

        // CONSTRUCTOR
        sequence(size_type initial_capacity = DEFAULT_CAPACITY);
        ~sequence ();
        sequence (const sequence& source);

        // MODIFICATION MEMBER FUNCTIONS
        void start ( );
        void advance ( );
        void insert (const value_type& entry);
        void attach (const value_type& entry);
        void remove_current ( );

        void add_front (const value_type& entry);
        void remove_front ();
        void add_end (const value_type& entry);
      void make_current ();
        void resize (size_type new_capacity);
        void sequence::reserve(size_type new_capacity);
               
        // OPERATOR OVERLOADED FUNCTIONS
        void sequence::operator +=(const sequence& addend);
        value_type operator [] (size_t index) const;
        void operator=(const sequence& source);

        // CONSTANT MEMBER FUNCTIONS
        size_type size( ) const;
        bool is_item( ) const;
        value_type current( ) const;
       

    private:
     
    value_type *data;
    size_type used;
    size_type capacity;
    size_type current_index;

    };

// NONMEMBER FUNCTIONS
sequence operator +(const sequence& s1, const sequence& s2);
void print_menu( );
char get_user_command( );
void show_sequence(sequence display);
double get_number( );
istream& operator >>( istream& ins, sequence& target);
ostream& operator <<( ostream& outs, sequence& display);

#include "testsequence.cxx" // include implementation file

#endif
Avatar billede arne_v Ekspert
13. april 2003 - 23:09 #1
Noget i retning af:

istream& operator>>(istream& ins,sequence& target)
{
    // læs data
    // f.eks.:
    s >> target.data;
    return ins;
}

ostream& operator<<(ostream& outs,sequence& display)
{
  // skriv data
  // f.eks.:
  outs << display.data << endl;
  return outs;
}
Avatar billede siul Nybegynder
13. april 2003 - 23:26 #2
Hej Arne_v,
Tak for dit svar - jeg proevede at indsaette functionerne, men uden held. Jeg aendrede prototyperne fra at vaere nonmember til member, fordi de jo faar access til de private variabler, men det virker heller ikke. Her er fejlmeldingen jeg faar, maaske du kan forstaa hvad problemet er:
Compiling...
testsequence.cpp
c:\documents and settings\my documents\testsequence.h(175) : error C2804: binary 'operator >>' has too many parameters
c:\documents and settings\my documents\testsequence.h(176) : error C2804: binary 'operator <<' has too many parameters
c:\documents and settings\my documents\testsequence.cxx(336) : error C2872: 'istream' : ambiguous symbol
c:\documents and settings\my documents\testsequence.cxx(336) : error C2872: 'istream' : ambiguous symbol
c:\documents and settings\my documents\testsequence.cxx(337) : error C2872: 'istream' : ambiguous symbol
c:\documents and settings\my documents\testsequence.cxx(337) : error C2872: 'istream' : ambiguous symbol
c:\documents and settings\my documents\testsequence.cxx(339) : error C2248: 'data' : cannot access private member declared in class 'sequence'
        c:\documents and settings\my documents\testsequence.h(186) : see declaration of 'data'
c:\documents and settings\my documents\testsequence.cxx(339) : error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'double *' (or there is no acceptable conversion)
c:\documents and settings\my documents\testsequence.cxx(345) : error C2872: 'ostream' : ambiguous symbol
c:\documents and settings\my documents\testsequence.cxx(345) : error C2872: 'ostream' : ambiguous symbol
Error executing cl.exe.

testsequence.obj - 10 error(s), 0 warning(s)
Avatar billede arne_v Ekspert
13. april 2003 - 23:28 #3
Hov.

De skal være non-member men erklæret som friend !
Avatar billede arne_v Ekspert
13. april 2003 - 23:30 #4
I public delen af .H filen:

friend istream& operator >>( istream& ins, sequence& target);
friend ostream& operator <<( ostream& outs, sequence& display);
Avatar billede siul Nybegynder
13. april 2003 - 23:35 #5
Ja, jeg kan se at den selvfoelgelig skal vaere en friend, siden den faar access til de private variabler.
Desvaerre brokker den sig stadigvaek naar jeg compiler.
Ville du have noget imod hvis jeg sender dig mine function implementation, saa du kan compile og maaske se den aabenbare fejl jeg laver?
Tak!
Avatar billede arne_v Ekspert
13. april 2003 - 23:37 #6
Helt OK.

Her ?  Eller via email ?
Avatar billede siul Nybegynder
13. april 2003 - 23:38 #7
via email er maaske det bedste, men det er op til dig.
Avatar billede arne_v Ekspert
13. april 2003 - 23:39 #8
arne_v@mail.danbbs.dk
Avatar billede arne_v Ekspert
14. april 2003 - 00:06 #9
Da data er en pointer manglede der et par *'er :

ins >> *target.data;
outs << *display.data << endl;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester