Zugriff auf private Komponente einer anderen Klasse (ohne friend)



  • Hiho,
    ich häng seit stunden an diesem Problem:
    Ich hab eine Matrix mit n² Einträgen programmiert mit einer Klasse "matrix" und in dieser steht der private Eintrag "int n;" für die Dimension und nun soll ich eine Klasse "vector" programmieren mit n Einträgen und darf ja aber nicht auf private Komponente von "matrix" zugreifen! Wie kann ich das lösen ohne friend Funktionen zu benutzen?

    Code (falls es nicht wirklich verständlich formuliert is 🙂 ):

    class vector;
    
    class matrix
    {
    private: 
    int n;
    double ** daten;
    public:
    matrix (int,double);
    double norm();
    vector operator * (vector v);
    friend istream& operator >> (istream& is, matrix& m);
    };
    
    class vector
    {
    private:
    int k;
    double* daten;
    public:
    vector (int,double);
    double& operator [] (int);
    friend vector operator * (vector v);
    friend ostream& operator << (ostream& os, vector v);
    };
    
    // Konstruktor für Matrix
    
    matrix::matrix (int dim, double Wert=0)
    {
              n = dim;
              daten = new double*[n];
              for(int i = 0; i < n; i++)
              {
                      daten[i] = new double[n];
              }
              for(int i = 0; i < n; i++)
              {
                      for(int j = 0; j < n; j++)
                      {
                              daten[i][j] = Wert;
                      }
              }
    }
    
    // norm()
    
    double matrix :: norm()
    {
    
    }
    
    // Operator * überladen
    
    vector matrix::operator * (vector v)
    {
    	for(int i=0; i < n; i++)
    	{
    		for(int j=0; j < n; j++)
    		{
    		v[i] += daten[i][j] * v[j];
    		}
    	}       
    }
    
    // Operator >> überladen
    
    istream& operator >> (istream& is, matrix& m)
    {
             for(int i = 0; i < m.n; i++)
             {
                     for(int j = 0; j < m.n; j++)
                     {
                             is >> m.daten[i][j];
                     }
             }
    }
    
    double& vector::operator [] (int i)
    {
    if (i >= 0 && i <= k.daten)
            return daten[i];
            else
            { cout << "Abbruch: der Index " << i <<
                    " liegt nicht im Bereich " << 0 << " bis " << n.daten;
                    exit(1);
            }
    }
    

    Mein Problem liegt nun an der Überladung am Ende bzw wenn ich den Konstruktor für die Klasse "vector" definieren muss, da ich keine Ahnung hab wie ich auf die "int n" Dimension von der Klasse "matrix" zugreifen kann, komm ich kein Stück weiter! Also die private Komponente "int k;" in der Klasse "vector" sollte eigentlich nicht da stehen, das war nur ein Versuch von mir das Problem mit der Dimension zu umgehen!

    Danke für die Hilfe und fürs eventuelle Hinweisen auf weitere Fehler! 🙂

    mfg danschler



  • Wenn es kein friend sein darf und du auf private Sachen zugreifen willst, dann geht das über die öffentliche Schnittstelle. Ansonsten hast du ja nichts von den privaten Sachen zu wissen. (wäre ja völlig gegen das Konzept).

    Also änderst du die Matrix dahingehend, dass es die Member nötigenfalls über öffentliche get/set erreichbar machen.



  • Darf ich aber laut Aufgabenstellung nicht 😕

    Ausschnitt aus Aufgabenstellung:
    Klasse matrix:

    Als private Datenelement:
    –- Ein (n x n)-dimensionales Feld daten mit n² Komponenten vom Typ double**.
    - –Eine Variable n vom Typ int, die die Dimension des Feldes abspeichert.

    Klasse vector:

    Als private Datenelement:
    –- Ein Feld daten mit n Komponenten vom Typ double*.

    Mein Problem is nun dass ich in Matrix meine Dimension "int n" hab aber in vector laut Aufgabenstellung soll nix von "int n" oder ähnlichem stehen! 😕


  • Mod

    danschler schrieb:

    Mein Problem is nun dass ich in Matrix meine Dimension "int n" hab aber in vector laut Aufgabenstellung soll nix von "int n" oder ähnlichem stehen! 😕

    Vectoren wissen selber wie groß sie sind: vector::size().



  • Und wie weit soll nun bei der Überladung meines Indexoperators die Bedingung laufen? Ich hab überhaupt keine Ahnung was ich nun eingeben soll/muss..


  • Administrator

    SeppJ schrieb:

    danschler schrieb:

    Mein Problem is nun dass ich in Matrix meine Dimension "int n" hab aber in vector laut Aufgabenstellung soll nix von "int n" oder ähnlichem stehen! 😕

    Vectoren wissen selber wie groß sie sind: vector::size().

    Die Aufgabenstellung! Kein std::vector ! *mit den Zaunpfahl winkt* 🤡

    @danschler,
    Könnte es nicht eher sein, dass du dich zu strikt an die Aufgabenstellung halten willst? Wahrscheinlich ist es bei Matrix so nur angegeben, dass man halt nur quadratische Matrizen erstellen können soll. Also nur eine Dimension soll gespeichert werden, da sie für beide gilt.
    Das n in der Aufgabenstellung für Vektoren hat aber nichts mit dem n bei den Matrizen zu tun. Und wenn du den Vektor vernünftig verwenden möchtest, musst du halt die Grösse speichern, ist halt einfach eine implizite Sache, was bei der Matrix halt nicht so genau gesagt werden kann, ob man jetzt nur ein n oder ein n und ein m speichern sollte 😉

    Grüssli



  • So jetzt hab ichs eigentlich aber irgendwie kommmt bei der Matrix-Vektormultiplikation 0 bzw. 5.28341e-308 raus..

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    class vector;
    
    class matrix
    {
    private: 
    int n;
    double ** daten;
    public:
    matrix (int,double);
    double norm();
    vector operator * (vector v);
    friend istream& operator >> (istream& is, matrix& m);
    };
    
    class vector
    {
    private:
    int k;
    double* daten;
    public:
    vector (int,double);
    double& operator [] (int);
    friend vector operator * (vector v);
    friend ostream& operator << (ostream& os, vector v);
    };
    
    // Konstruktor für Matrix
    
    matrix::matrix (int dim, double Wert=0.0)
    {
              n = dim;
              daten = new double*[n];
              for(int i = 0; i < n; i++)
              {
                      daten[i] = new double[n];
              }
              for(int i = 0; i < n; i++)
              {
                      for(int j = 0; j < n; j++)
                      {
                              daten[i][j] = Wert;
                      }
              }
    }
    
    // norm()
    
    double matrix :: norm()
    {
    
    }
    
    // Operator * überladen
    
    vector matrix::operator * (vector v)
    {
    	for(int i=0; i < n; i++)
    	{
    		for(int j=0; j < n; j++)
    		{
    		v[i] += daten[i][j] * v[j];
    		}
    	}       
    }
    
    // Operator >> überladen
    
    istream& operator >> (istream& is, matrix& m)
    {
             for(int i = 0; i < m.n; i++)
             {
                     for(int j = 0; j < m.n; j++)
                     {
                             cout << i << ". Spalte und " << j << ". Zeile eingeben: " << endl;
                             is >> m.daten[i][j];
                     }
             }
    }
    
    // Konstruktor Vektor überladen
    
    vector::vector(int dim,double Wert=0.0)
    {
              k = dim;
              daten = new double[k];
              for(int i = 0; i < k; i++)
              {
                     daten[i] = Wert;
              }
    }
    
    // Operator [] überladen
    
    double& vector::operator [] (int i)
    {
            if (i >= 0 && i <= k)
            return daten[i];
            else
            { 
                    exit(1);
            }
    }
    
    // Operator << überladen
    
    ostream& operator << (ostream& os, vector v)
    {
           for(int i = 0; i < v.k; i++)
           {
                 os << v.daten[i];
                 return os;
           }
    } 
    
    int main()
    {
    int dimension;
    
    cout << "Geben Sie die Dimension an: ";
    cin >> dimension;
    
    matrix A(dimension);
    vector b(dimension);
    
    cout << "Matrix erzeugt!" << endl;
    
    cout << "Matrix eingeben: " << endl;
    cin >> A;
    
    for(int i = 0; i < dimension; i++)
    {
            cout << i  << ". Stelle des Vektors" << endl;
            cin >> b[i];
    }
    
    //cout << "Matrix eingeben: " << endl;
    //cin >> A;
    
    //cout << "Vektor eingeben: " << endl;
    //cin >> b;
    
    cout << "Produkt von A * b = " << A * b << endl;
    
    return 0;
    }
    

    Wär cool wenn jemand den Fehler findet!



  • Wäre doch irgendwie nicht schlecht, wenn matrix::operator* auch was zurückgeben würde, oder?



  • jop habs grad selber gesehen 🤡 und "return v;" hinzugefügt aber jetzt kommt statt ner vektorausgabe bei mir 6100 raus wenn ich als matrix
    (1 2 / 3 4) und bei dem Vektor (1 2) nehme 😕

    edit: ok Fehler gefunden, aber keine Ahnung wie ich ihn verbessern sollte, da ich ja doch eigentlich bei der Rechnung 2 Vektoren + 1 Matrix brauch oder? Wo bekomm ich nach "v" den anderen Vektor her?

    edit2: ok Problem gelöst aber:

    vector matrix::operator * (vector v)
    {
        double* summe = new double [n];
    	for(int i=0; i < n; i++)
    	{
    		for(int j=0; j < n; j++)
    		{
    		summe[i] += daten[i][j] * v[j];
    		}
    	} 
    	for(int i = 0; i < n; i++) v[i] = summe[i];
        return v;      
    }
    

    gehts nicht eleganter?


  • Administrator

    danschler schrieb:

    ..., da ich ja doch eigentlich bei der Rechnung 2 Vektoren + 1 Matrix brauch oder?

    Ehm was? Ich glaube, dass du nochmals die Thematik Matrizen und Vektoren anschauen solltest. Du kannst ohne Probleme einen Vektor mit einer Matrix multiplizieren, sofern sie jeweils die richtigen Dimensionen aufweisen.

    Des Weiteren würde ich dir noch folgenden Artikel empfehlen zu lesen:
    Überladung von Operatoren

    Grüssli



  • Ich meinte damit dass ich ja ein Ergebnisvektor rausbekomme indem ich ne Matrix und n Vektor multiplizier oder? Meine Matrix ist ja daten und mein vektor is v (oder?) aber was is mein Ergebnisvektor?


Anmelden zum Antworten