Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C++] Overloading

  1. #1

    [C++] Overloading

    codice:
    // Member function definitions for class String
    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    #include <iomanip>
    
    using std::setw;
    
    #include <cstring>
    #include <cassert>
    #include "string1.h"
    
    // Conversion constructor: Convert char * to String
    String::String( const char *s ) : length( strlen( s ) )
    {
       cout << "Conversion constructor: " << s << '\n';
       setString( s );         // call utility function
    }
    
    // Copy constructor
    String::String( const String &copy ) : length( copy.length )
    {
       cout << "Copy constructor: " << copy.sPtr << '\n';
       setString( copy.sPtr ); // call utility function
    }
    
    // Destructor
    String::~String()
    {
       cout << "Destructor: " << sPtr << '\n';
       delete [] sPtr;         // reclaim string
    }
    
    // Overloaded = operator; avoids self assignment
    const String &String::operator=( const String &right )
    {
       cout << "operator= called\n";
    
       if ( &right != this ) {         // avoid self assignment
          delete [] sPtr;              // prevents memory leak
          length = right.length;       // new String length
          setString( right.sPtr );     // call utility function
       }
       else
          cout << "Attempted assignment of a String to itself\n";
    
       return *this;   // enables cascaded assignments
    }
    
    const String &String::operator+( const String &right )
    {
       cout << "operator= called\n";
    
       if ( &right != this ) {         // avoid self assignment
          delete [] sPtr;              // prevents memory leak
          length = right.length;       // new String length
          setString( right.sPtr );     // call utility function
       }
       else
          cout << "Attempted assignment of a String to itself\n";
    
       return *this;   // enables cascaded assignments
    }
    
    // Concatenate right operand to this object and
    // store in this object.
    const String &String::operator+=( const String &right )
    {
       char *tempPtr = sPtr;        // hold to be able to delete
       length += right.length;      // new String length
       sPtr = new char[ length + 1 ]; // create space
       assert( sPtr != 0 );   // terminate if memory not allocated
       strcpy( sPtr, tempPtr );     // left part of new String
       strcat( sPtr, right.sPtr );  // right part of new String
       delete [] tempPtr;           // reclaim old space
       return *this;                // enables cascaded calls
    }
    
    // Is this String empty?
    bool String::operator!() const { return length == 0; }
    
    // Is this String equal to right String?
    bool String::operator==( const String &right ) const
       { return strcmp( sPtr, right.sPtr ) == 0; }
    
    // Is this String less than right String?
    bool String::operator<( const String &right ) const
       { return strcmp( sPtr, right.sPtr ) < 0; }
    
    // Return a reference to a character in a String as an lvalue.
    char &String::operator[]( int subscript )
    {
       // First test for subscript out of range
       assert( subscript >= 0 && subscript < length );
    
       return sPtr[ subscript ];  // creates lvalue
    }
    
    // Return a reference to a character in a String as an rvalue.
    const char &String::operator[]( int subscript ) const
    {
       // First test for subscript out of range
       assert( subscript >= 0 && subscript < length );
    
       return sPtr[ subscript ];  // creates rvalue
    }
    
    // Return a substring beginning at index and
    // of length subLength
    String String::operator()( int index, int subLength )
    {
       // ensure index is in range and substring length >= 0
       assert( index >= 0 && index < length && subLength >= 0 );
    
       // determine length of substring
       int len;
    
       if ( ( subLength == 0 ) || ( index + subLength > length ) )
          len = length - index;
       else
          len = subLength;
    
       // allocate temporary array for substring and 
       // terminating null character
       char *tempPtr = new char[ len + 1 ];
       assert( tempPtr != 0 ); // ensure space allocated
    
       // copy substring into char array and terminate string
       strncpy( tempPtr, &sPtr[ index ], len );
       tempPtr[ len ] = '\0';
    
       // Create temporary String object containing the substring
       String tempString( tempPtr );
       delete [] tempPtr;  // delete the temporary array
    
       return tempString;  // return copy of the temporary String
    }
    
    // Return string length
    int String::getLength() const { return length; }
    
    // Utility function to be called by constructors and 
    // assignment operator.
    void String::setString( const char *string2 )
    {
       sPtr = new char[ length + 1 ]; // allocate storage
       assert( sPtr != 0 );  // terminate if memory not allocated
       strcpy( sPtr, string2 );       // copy literal to object
    }
    
    // Overloaded output operator
    ostream &operator<<( ostream &output, const String &s )
    {
       output << s.sPtr;
       return output;   // enables cascading
    }
    
    // Overloaded input operator
    istream &operator>>( istream &input, String &s )
    {
       char temp[ 100 ];   // buffer to store input
    
       input >> setw( 100 ) >> temp;
       s = temp;        // use String class assignment operator
       return input;    // enables cascading
    }
    
    // Driver for class String
    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    #include "string1.h"
    
    int main()
    {
       String s1( "happy" ), s2( " birthday" ), s3;
    
       // test overloaded equality and relational operators
       cout << "s1 is \"" << s1 << "\"; s2 is \"" << s2
            << "\"; s3 is \"" << s3 << '\"' 
            << "\nThe results of comparing s2 and s1:"
            << "\ns2 == s1 yields " 
            << ( s2 == s1 ? "true" : "false" )
            << "\ns2 != s1 yields " 
            << ( s2 != s1 ? "true" : "false" )
            << "\ns2 >  s1 yields " 
            << ( s2 > s1 ? "true" : "false" ) 
            << "\ns2 <  s1 yields " 
            << ( s2 < s1 ? "true" : "false" ) 
            << "\ns2 >= s1 yields "
            << ( s2 >= s1 ? "true" : "false" )
            << "\ns2 <= s1 yields " 
            << ( s2 <= s1 ? "true" : "false" );
    
       // test overloaded String empty (!) operator
       cout << "\n\nTesting !s3:\n";
       if ( !s3 ) {
          cout << "s3 is empty; assigning s1 to s3;\n";
          s3 = s1;              // test overloaded assignment
          cout << "s3 is \"" << s3 << "\"";
       }
    
       // test overloaded String concatenation operator
       cout << "\n\ns1 += s2 yields s1 = ";
       s1 += s2;                // test overloaded concatenation
       cout << s1;
    
       // test conversion constructor
       cout << "\n\ns1 += \" to you\" yields\n";
       s1 += " to you";         // test conversion constructor
       cout << "s1 = " << s1 << "\n\n";
    
       // test overloaded function call operator () for substring
       cout << "The substring of s1 starting at\n"
            << "location 0 for 14 characters, s1(0, 14), is:\n"
            << s1( 0, 14 ) << "\n\n";
    
       // test substring "to-end-of-String" option
       cout << "The substring of s1 starting at\n"
            << "location 15, s1(15, 0), is: "
            << s1( 15, 0 ) << "\n\n";  // 0 is "to end of string"
    
       // test copy constructor
       String *s4Ptr = new String( s1 );  
       cout << "*s4Ptr = " << *s4Ptr << "\n\n";
    
       // test assignment (=) operator with self-assignment
       cout << "assigning *s4Ptr to *s4Ptr\n";
       *s4Ptr = *s4Ptr;          // test overloaded assignment
       cout << "*s4Ptr = " << *s4Ptr << '\n';
    
       // test destructor
       delete s4Ptr;     
    
       // test using subscript operator to create lvalue
       s1[ 0 ] = 'H';      
       s1[ 6 ] = 'B';
       cout << "\ns1 after s1[0] = 'H' and s1[6] = 'B' is: "
            << s1 << "\n\n";
    
       // test subscript out of range
       cout << "Attempt to assign 'd' to s1[30] yields:" << endl;
       s1[ 30 ] = 'd';     // ERROR: subscript out of range
    
       return 0;
    }
    Da questo codice dovrei fare un overloadning che mi permetta di eseguire l'operazione

    Stringa1 = stringa2 + strnga3; senza modificare gli oggetti stranga2 e stringa3.

    Però se io creo l'oggetto dentro al funziona, all'uscitta della funzione l'oggetto creato mi viene automaticamente distrutto giusto?

    Quindi come potri fare per mantenere la copia?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246

    Re: [C++] Overloading

    Originariamente inviato da SkOrPiOn`87


    Da questo codice dovrei fare un overloadning che mi permetta di eseguire l'operazione

    Stringa1 = stringa2 + strnga3; senza modificare gli oggetti stranga2 e stringa3.

    Però se io creo l'oggetto dentro al funziona, all'uscitta della funzione l'oggetto creato mi viene automaticamente distrutto giusto?

    Quindi come potri fare per mantenere la copia?

    Grazie

    non ho letto tutto il codice (non sono poi molto bravo!!)
    se vuoi mantenere la stringa1, perchè non passi alla funzione un puntatore a stringa?
    Per liquidare un popolo si comincia con il privarli della memoria.Si distruggono i loro libri, la loro cultura, la loro storia. E qualcun’ altro scrive loro altri libri, li fornisce di un’altra cultura, inventa per loro un’altra storia. (Milan Kundera)

  3. #3
    ma io la stringa s1 la creo dentro la funzione, quindi non posso passarla dentro la funzione perchè ancora non esiste

  4. #4
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    // Concatenate right operand to this object and
    // store in this object.
    const String &String:perator+=( const String &right )
    {
    char *tempPtr = sPtr; // hold to be able to delete
    length += right.length; // new String length
    sPtr = new char[ length + 1 ]; // create space
    assert( sPtr != 0 ); // terminate if memory not allocated
    strcpy( sPtr, tempPtr ); // left part of new String
    strcat( sPtr, right.sPtr ); // right part of new String
    delete [] tempPtr; // reclaim old space
    return *this; // enables cascaded calls
    }
    se non ho compreso male, tu devi deallocare il puntatore sPtr, avendolo allocato dinamicamente..
    il problema è che il tutto dovrebbe essere trasparente all'utilizzatore, giusto??
    se è così, in realtà dovresti bypassare il problema ricordando all'utilizzatore di deallocare quel puntatore.

    un situazione simile mi capitò quando feci l'esame di programmazione all'università: il professore mi disse che quella era la soluzione..
    Per liquidare un popolo si comincia con il privarli della memoria.Si distruggono i loro libri, la loro cultura, la loro storia. E qualcun’ altro scrive loro altri libri, li fornisce di un’altra cultura, inventa per loro un’altra storia. (Milan Kundera)

  5. #5
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    allora?
    era come dicevo?
    Per liquidare un popolo si comincia con il privarli della memoria.Si distruggono i loro libri, la loro cultura, la loro storia. E qualcun’ altro scrive loro altri libri, li fornisce di un’altra cultura, inventa per loro un’altra storia. (Milan Kundera)

  6. #6
    Si grazie mille

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.