[OOP] Vererbung

Online-Skater

Erfahrenes Mitglied
Habe ein Problem mit dem Vererben, bin noch blutiger Anfänger :(

C++:
// Hauptklasse in vector.h
#include <cassert>
#include <iostream>
using namespace std;

#ifndef VECTOR_H
#define VECTOR_H

class Vector
{
	int *p;
	const int i1;
	int num;
  public:
    // Operatoren für Vectoren
    const Vector& operator=  (const Vector&);
    bool          operator== (const Vector&) const;
    bool          operator!= (const Vector&) const;
    const Vector& operator+= (const Vector&);
    Vector        operator+  (const Vector&) const;
    const Vector& operator+= (int);
    Vector        operator+  (int) const;
    const Vector& operator-= (const Vector&);
    Vector        operator-  (const Vector&) const;
    const Vector& operator-= (int);
    Vector        operator-  (int) const;
    const Vector& operator++ ();                        // prefix  ++v
    Vector        operator++ (int);                     // postfix v++
    const Vector& operator-- ();                        // prefix  --v
    Vector        operator-- (int);                     // postfix v--
    const Vector& operator*= (const Vector&);
    Vector        operator*  (const Vector&) const;
    const Vector& operator/= (const Vector&);
    Vector        operator/  (const Vector&) const;
    const Vector& operator&= (const Vector&);
    Vector        operator&  (const Vector&) const;
    const Vector& operator&= (const int&);
    Vector        operator&  (const int&) const;
    friend Vector operator&  (const int&,const Vector&); // other order
    Vector        operator-  () const;
    int&          operator[] (int);
    int           operator[] (int) const;
    Vector        operator() (int,int);
    friend ostream& operator<< (ostream&,const Vector&);
    friend istream& operator>> (istream&,Vector&);
    int operator^ (const Vector& v) const;
    // Standardmemberfunktionen
	Vector(int first_index=1, int number=0);
	Vector(const Vector&);
    ~Vector() {delete[] p;}
	int first() const { return i1; }
	int last() const { return i1+num-1; }
	int length() const { return num; }
	int read(int);
	void change(int,int);
};
#endif
C++:
// Abgeleitete Klasse in SuperInt.h
#include "vector.h"

#ifndef SUPERINT_H
#define SUPERINT_H

class SuperInt : protected Vector
{
    SuperInt(bool neg,int len)
    : Vector(0,len), negative(neg) {};
    bool negative;
  public:
    SuperInt(long int n = 0);
    Vector::length;             // access control
    int      operator() (int)             const;  //gives digit no. k
    SuperInt operator+  (const SuperInt&) const;
    SuperInt operator-  (const SuperInt&) const;
    SuperInt operator*  (const SuperInt&) const;
    SuperInt operator*  (int)             const;
    SuperInt operator/  (const SuperInt&) const;
    SuperInt operator/  (int)             const;
    SuperInt operator-  ()                const;
    bool     operator== (const SuperInt&) const;
    bool     operator!= (const SuperInt&) const;
    bool     operator<  (const SuperInt&) const;
    bool     operator>  (const SuperInt&) const;
    bool     operator<= (const SuperInt&) const;
    bool     operator>= (const SuperInt&) const;
    friend istream& operator>> (istream&, SuperInt);
    friend ostream& operator<< (ostream&, const SuperInt);
};
#endif
Hier das Problem
C++:
#include "SuperInt.h"
#include <cmath>

// Hilfsfkt. für Anzahl der Stellen
int num_digit(long int n)
{
    if (n==0)
      return 1;
    else
      return (int)log10(labs(n)) + 1;
}

// Default- and type conversion constructor
SuperInt::SuperInt(long int n)
: Vector(0, num_digit(n))
{
    negative = (n<0);
    n = labs(n);            // Absolutwert
    for (int k=0; k<length(); k++)
    {
        (*this)[k] = n % 10;   // Save the digits <----FEHLER
        n /= 10;               // backwards
    }
}
Meldung:
:: === SuperInt, Debug ===
D:\PROJECTS\C++\OOP\SuperInt\SuperInt.cpp:21: error: no match for 'operator[]' in '*(SuperInt*)this[k]'
:: === Build finished: 1 errors, 0 warnings ===


Dieser Operator solle eigentlich vererbt werden von vector in der vector.cpp
C++:
 // Ausschnitt 
// Overloading the index operator
int& Vector::operator[] (int i)
{
    assert(i >= i1 and i <= last());
    return p[i-i1];   // return a reference
}
int Vector::operator[] (int i) const
{
    assert(i >= i1 and i <= last());
    return p[i-i1];   // return a copy
}

Woran könnte das liegen ? :confused:
 
Merkwürdigerweise funktioniert es jetzt. Ich habe die Mutterklasse (vector.h und vector.cpp) nochmal neu eingebunden, offensichtlich waren die vorherigen veraltet... :rolleyes:

@Teambeta

An der Zugriffskontrolle lag es nicht denn protected sagt hier aus das die Members die in der Mutterklasse public oder protected sind, in der vererbeten Klasse protected werden. Trotzdem Danke :)

mfg
 
Merkwürdigerweise funktioniert es jetzt. Ich habe die Mutterklasse (vector.h und vector.cpp) nochmal neu eingebunden, offensichtlich waren die vorherigen veraltet... :rolleyes:

@Teambeta

An der Zugriffskontrolle lag es nicht denn protected sagt hier aus das die Members die in der Mutterklasse public oder protected sind, in der vererbeten Klasse protected werden. Trotzdem Danke :)

mfg

Ja, was habe ich denn gesagt?
Und was macht protected denn? ;)
 
Sorry hab dich dann ein bischen falsch verstanden.
ABER ich greife ja nicht von außen zu, sondern in der SuperInt.cpp in der ich die Methoden definiere.

Aber ist ja alles ok :)
 
So jetzt ist die Klasse SuperInt vollendet und ich bekomme wieder einen Zugriffsfehler, diesmal bei den friend functions istream und ostream, die meinem Verständis zufolge auch Zugriff über Membervariablen, welche in private liegen, haben müssten.

Meldung
:: === SuperInt, Debug ===
D:\PROJECTS\C++\OOP\Vererbung\SuperInt\SuperInt.h:9: error: `SuperInt::SuperInt(bool, int)' is private
D:\PROJECTS\C++\OOP\Vererbung\SuperInt\SuperInt.cpp:259: error: within this context

Damit ist der im private angelegte Constructor gemeint.
PHP:
// Input operator
istream& operator>> (istream& is, SuperInt& b)
{
    cin >> ws;     // Skip blank characters
    char s[500], *q = s, sign = '+';
    if (cin.peek() == '+' or cin.peek() == '-')
      cin >> sign;
    while (cin.peek() >= '0' and cin.peek() <= '9')
      cin >> *q++;
    *q = '\0';
    q = s;
    if (strlen(q) == 0)     // No digits
    {
        cout << "Incorrect integer" << endl;
        abort();
    }
    while (*q == '0')       // Skip leading zeros
      q++;
    if (strlen(q) == 0)     // The number 0 is a special case
      b == 0;
    else
    {
        SuperInt temp(sign == '-', strlen(q));   // <----HIER 
        for (int i=temp.length()-1; i>=0; i--)     
          temp[i] = *q++ - '0';                        // Auch der index operator ist betroffen
        b = temp;
    }
    return is;
}
Die Input/Output Operatoren von der Mutterklasse(Vector) werden von der abgeleiteten Klasse(SuperInt) überschrieben.
Wo ist der Fehler bzw. habe ich etwas vergessen ? Im Grunde genommen habe ich das von einem Buch abgetippt...:rolleyes:
 
Zurück