2016-11-23 1 views
0

Ich möchte einen Zeiger auf eine Klassenmethode übergeben und diese Funktion von einem Iterator aufrufen. Der folgende Code kann nicht kompiliert werden, wenn ich ein abgeleitetes Objekt einschließe. Ich habe versucht, einen Typnamen für den Klassenspezifizierer (z. B. TC :: * pf) zu verwenden, aber das funktioniert nicht. Kann jemand vorschlagen, wie das funktioniert?Aufruf der Funktion durch Iterator kann nicht auf abgeleiteten Objekt kompilieren

#include <iostream> 
#include <vector> 
#include <algorithm> 

using std::cout; 
using std::endl; 
using std::vector; 

class Base { 

public: 

    Base(int bval) : bval_(bval) { } 

    virtual void print() { 
    cout << "Base: bval:" << bval_ << endl; 
    } 

protected: 
    int bval_; 
}; 

class Derived : public Base { 

    Derived(int bval, int dval) : Base(bval), dval_(dval) { } 

    virtual void print() { 
    cout << "Derived: bval:" << bval_ << " dval:" << dval_ << endl; 
    } 

private: 
    int dval_; 
}; 

typedef vector<Base*>  MyVecType; 
typedef MyVecType::iterator MyVecTypeIter; 

template <typename T> 
void testFunc(MyVecType& v, T (Base::*pf)()) { 

    for (MyVecTypeIter iter = v.begin(); iter != v.end(); ++iter) { 
    ((*iter)->*pf)(); 
    } 

} 


int main() { 

    MyVecType bvec; 

    bvec.push_back(new Base(44)); 
    bvec.push_back(new Base(55)); 

    // above compiles and runs ok, but this fails to compile 
    // with 'no matching function' error: 
    bvec.push_back(new Derived(66)); 

    testFunc(bvec, &Base::print); 

    return 0; 

} 
+1

Sie haben kein Konstruktor von 'Derived' mit einem einzigen Parameter (weder öffentlich noch privat) ... geben Compilerfehler einen großen Hinweis Es ist wirklich lesenswert :) –

+0

Das ist nicht das Problem, aber verwenden Sie nicht 'std :: endl', es sei denn, Sie benötigen die zusätzlichen Sachen, die es tut. '\ n'' beendet eine Zeile. –

Antwort

1

Linie

bvec.push_back(new Derived(66)); 

Compiler nicht, weil abgeleitete Klasse Konstruktor privat ist und definiert zwei int Argumente zu nehmen.

dass Fix und es wird kompilieren und ausführen:

http://cpp.sh/9nrkc

+0

Danke - Ich habe meine Frage eigentlich vermasselt. Es war ein anderer Fehler, den ich hätte posten wollen. Es gab eine Möglichkeit, den obigen Code für eine Methode zu verwenden, die nur in der abgeleiteten Klasse enthalten ist. Der einzige Weg, um es zum Laufen zu bringen, ist eine Standardimplementierung in der Basisklasse, die ich lieber nicht machen würde, aber ich weiß nicht, ob es einen Weg gibt. – ark262

+0

Sie können auch eine reine virtuelle Funktion für die Basisklasse verwenden, um sie abstrakt zu machen und abgeleitete Klassen zu erzwingen, um sie zu implementieren. – GameSalutes

Verwandte Themen