Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Templates Erben funktioniert nicht

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 <
000
27.09.2015, 17:36 Uhr
Ken



Hallo,

wir wollten eine virtuelle Klass schreiben von der dann später mehrere Klassen erben sollen und die Methoden überschreiben. Leider funktioniert dies gar nicht, da die erbende Klasse angeblich abstrakt ist, obwohl wir der Meinung sind alle rein virtuellen Funktionen überschrieben zu haben.

Erstmal zum Code:

main.cpp

C++:
#include <windows.h>
#include <iostream>
#include "header/calculator.h"
#include "stdio.h"
#include "header/Integer.h"

using namespace std;

auto main()
{
AllocConsole();
    freopen("conin$", "r", stdin);
    freopen("conout$", "w", stdout);
    freopen("conout$", "w", stderr);
    printf("Debugging Window:\n");

    Calculator<Integer> calc;
    Integer i(2);
    Integer g(3);
    calc.sum(i, g);
    cout << result.getInt();
}



arithmetic.h

C++:
#pragma once
using namespace std;

template<class V>
class Arithmetic {

public:
    /*
    @returns V: sum of the values
    */

    virtual V& sum(V& arg0) = 0;
};



integer.h

C++:
#pragma once
#include "arithmetic.h"

using namespace std;

class Integer : public Arithmetic<Integer>
{

private:
    

public:
    int value;
    Integer(int value);
    int Integer::getInt();
};



integer.cpp

C++:
#include "header/Integer.h"

Integer::Integer(int value)
{
    this->value = value;
}

int Integer::getInt()
{
    return this->value;
}

//hier sind wir ganz unsicher, ob die Vererbung so correkt ist. Haben schon viel hier //ausprobiert. So findet VS wenigstens die richtige deklaration. Und es gibt keinen Fehler
//bei "return result"
template<class V>
V& Arithmetic<V>::sum(V& arg0)
{
    int i = this->value + arg0.getInt();
    Integer result(i);
    return result;
}



calculator.h

C++:
using namespace std;

template<class V>
class Calculator {
public:

    /*
    @returns V: sum of the values
    */

    V sum(V a, V b);

};



calculator.cpp

C++:
#include "header\calculator.h"


template<class V>
V Calculator<V>::sum(V a, V b)
{
    V result = a.Arithmetic<V>::sum(b);
    return result;
}



Fehlermeldungen:
Schweregrad Fehler
Code C2259
Beschreibung "Integer": Instanz von abstrakter Klasse kann nicht erstellt werden

Wir sind leider inzwischen komplett überfragt und bräuchten dringend Hilfe. Dafür schon mal danke.

Mfg
Ken
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.09.2015, 15:32 Uhr
TOSHMAX



Integer ist abstrakt, weil ihr die Methode sum nie überschrieben habt.

Hierzu müsste in integer.h stehen:

C++:
class Integer : public Arithmetic<Integer>
{
    ...
    virtual Integer& sum(Integer& arg0);
};


Und z.B. in integer.cpp:

C++:
Integer& Integer::sum(Integer& arg0)
{
    int i = this->value + arg0.getInt();
    Integer result(i);
    return result;
}
};


Die Definition von Arithmetic<V>::sum macht hier keinen Sinn, weil die Klasse Arithmetic ja nicht weiß, was sie mit einem V anfangen soll.

Ihr solltet außerdem keine Referenzen in sum zurückgeben, da diese nach dem durchlaufen der Funktion ungültig sind. Dafür sollte euch der Compiler aber Warnungen ausgeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: