Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » friend ostream "<<" kann nicht auf private zugreifen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
21.03.2006, 18:44 Uhr
rendner



Hoffe ich bin hier in der richtigen Ecke gelandet...
Habe ein kleines problem mit dem "ostream operator <<", habe auch schon im Internet danach geschaut und hier die Suche gewälzt, aber irgendwie find ich den Fehler nicht. Entweder hab ich Tomaten auf den Augen oder es liegt an meinem Visual C++ 6.0.

Hier die Klassendefinition:

C++:
#ifndef _VEKTOR_H
#define _VEKTOR_H

#include <iostream>
#include <iomanip>

using namespace std;

class Vektor
{

    friend ostream& operator << ( ostream& , const Vektor& );

    public:
         Vektor( int , char *name = NULL );

         ~Vektor( void );
    
    
         Vektor& operator =  ( const Vektor& );
         Vektor& operator +  ( const Vektor& );
         Vektor& operator -  ( const Vektor& );
        
         double  operator [] ( int           );
         double  operator *  ( const Vektor& );

    
    
    private:
          double *v;
          int dim;
          char *Name;
};

#endif



so habe ich den Operator << überladen und rufe ihn auf...

C++:
ostream& operator<<( ostream & ost , Vektor &V )
{
    ost << "Name: " << V.Name;

    return ost;
}

int main( void )
{
    Vektor V1( 12, "V1" );

    cout << V1 << endl;

    return 0;
}



Und das sagt mir der Compiler:

Zitat:

error C2248: "Name" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "Vektor" erfolgte



Wenn ich wie in der Klassendefinition den 2ten Parameter bei der << Operatorüberladung als const Vektor &V deklariere bekomme ich sogar noch eine Fehlermeldung:

Zitat:

error C2593: 'Operator <<' ist mehrdeutig


Und verweist auf die Zeile in der main Funktion wo ich das cout nutze.


Wo ist der Fehler?
An der Klassendefinition kann man nix ändern, da diese vorgegeben wurde.

mfg rendner
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.03.2006, 21:46 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
das const muss da schon vor sonst ist das für den Compiler ne andere Funktion als die,die du als friend deklariert hast. Da scheint irgendwas anderes schief zu laufen.
Poste doch mal den ganzen aktuellen Code(zumindest das was mit Vector zu tun hat )

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.03.2006, 11:10 Uhr
rendner



Hier mal der Konstruktor mehr braucht man ja nicht...
( wenn der 2te Parameter NULL ist soll als Name "v" vergeben werden, nicht das sich einer wundert )

C++:
Vektor::Vektor( int Dim , char * name )
{
    
    dim = ( Dim < 1 ) ? 1 : Dim;
    
    v = new double[ dim ];

    for( int i = 0; i < dim ; i++ )  v[ i ] = 1.0;

    if( name == NULL )
    {
        Name = new char[ 2 ];
        strcpy( Name, "v" );
    }
    else
    {
        Name = new char[ strlen( name ) + 1 ];
        strcpy( Name, name );
    }        
}



Ich denke das der Code "sauber" ist, ich hatte irgendwie schon mal ein Problem mit dem streamoperator.
Und damals funktionierte, das glaube ich, in anderen Visual 6.0 Umgebungen aber bei mir nicht.

Kann das sein das ich noch irgend etwas "konfigurieren" muss?

mfg rendner

Dieser Post wurde am 22.03.2006 um 11:13 Uhr von rendner editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.03.2006, 12:30 Uhr
rendner



So hab das gerade mit einer "Microsoft Visual Studio .NET 2003" Umgebung getestet und da funktioniert es natürlich.

Nun würde ich aber gerne mal wissen woran das liegt, damit ich auch mit "meiner" Version arbeiten kann ohne das der Compiler streikt.

mfg rendner
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.03.2006, 14:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi du hast an der markierten stelle ein const vergessen, darum findet der alte den "friend" nicht, mit dem const sollte es auch mit vc6 funktionieren.


C++:
ostream& operator<<( ostream & ost , const Vektor &V )
{
    ost << "Name: " << V.Name;

    return ost;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.03.2006, 15:07 Uhr
rendner




Zitat von FloSoft:

hi du hast an der markierten stelle ein const vergessen, darum findet der alte den "friend" nicht, mit dem const sollte es auch mit vc6 funktionieren.


Nein, daran liegt es nicht wie du auch in Beitrag 1 lesen kannst.
Hatte das nur mit und ohne const probiert und es vergessen im Beitrag 1 zu ändern.

Es funktioniert definitiv nicht bei meinem Visual 6.0, und ich kann mir nicht erklären woran das liegt.

mfg rendner
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.03.2006, 15:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja vc6 ist nun mal verdammt alt "standardkonformität" kennt das teil halt nicht
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.03.2006, 16:02 Uhr
ao

(Operator)


Moin,

der abgebildete Code kompiliert mit VC6. Änderungen gegenüber rendners Code:
* Konstruktor wie oben eingebaut
* Destruktor nachgeliefert (fehlte -> Linkerfehler)
* const ergänzt wie von FloSoft angemahnt

VC6 ist zwar alt, aber so alt nun auch wieder nicht.

ao


C++:
#include <iostream>
#include <iomanip>

using namespace std;

class Vektor
{
    friend ostream& operator << ( ostream& , const Vektor& );

    public:
         Vektor( int , char *name = NULL );

         ~Vektor( void );

         Vektor& operator =  ( const Vektor& );
         Vektor& operator +  ( const Vektor& );
         Vektor& operator -  ( const Vektor& );

         double  operator [] ( int           );
         double  operator *  ( const Vektor& );

    private:
          double *v;
          int dim;
          char *Name;
};

Vektor::Vektor( int Dim , char * name )
{

    dim = ( Dim < 1 ) ? 1 : Dim;

    v = new double[ dim ];

    for( int i = 0; i < dim ; i++ )  v[ i ] = 1.0;

    if( name == NULL )
    {
        Name = new char[ 2 ];
        strcpy( Name, "v" );
    }
    else
    {
        Name = new char[ strlen( name ) + 1 ];
        strcpy( Name, name );
    }
}

Vektor::~Vektor ()
{
    delete [] Name;
    delete [] v;
}

ostream& operator<<( ostream & ost , const Vektor &V )
{
    ost << "Name: " << V.Name;

    return ost;
}

int main( void )
{
    Vektor V1( 12, "V1" );

    cout << V1 << endl;

    return 0;

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.03.2006, 16:21 Uhr
rendner



Tut mir leid, so hab ich es auch und es geht wirklich nicht.
Ich würde es ja auch nicht glauben wenn mir das einer erzählen würde, aber es ist so.

Hatte das ja irgendwie schon mal vor längerer Zeit und da lief es auch auf ner anderen 6er Umgebung.
Und mit nochmal neu installieren gehts auch nicht da ich zwischenzeitlich auch schon meinen PC mal platt gemacht hatte.

Trotzdem Danke für eure Bemühungen... falls einer ähnliche Probleme hatte oder Tipps zur Behebung dieses "BUGS" hat würde ich mich freuen, da der sch*** Compiler mir keine exe erzeugt.

Muss ich halt als workaround solange der Klasse get/ set Methoden zur Verfügung stellen, ...sehr unschön.

mfg rendner
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.03.2006, 17:22 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


haste evtl die servicepacks (fürn vc) vergessen draufzuspielen? da gibts doch imho sp6?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: