2012-07-17 6 views
0

J'essaie d'étendre une application existante en utilisant une bibliothèque agile. La bibliothèque me force à créer une classe d'interface concrète, InterfaceToA pour interfacer avec mon application. Cependant, dans mon application, l'endroit le plus naturel (sans un refactor majeur) pour instancier cet objet est dans l'implémentation d'une autre classe, disons ClassA. J'ai vraiment besoin de la classe d'interface pour avoir accès à toutes les données et fonctions membres ClassA (hériter de). Donc, quelque chose comme:Héritage et instanciation C++ des classes dépendantes

// Class declarations 
class ClassA { 
    public: 
    double thing1; 
    double thing2; 
    f(double arg1, double arg2); 
    ff() 
}; 

class InterfaceToA : public ClassA { 
    public: 
    g(double arg1, double arg2); 
}; 

// Class implementations 
double ClassA::f(double arg1, double arg2){ 
    InterfaceToA interface; 
    return interface.g(arg1,arg2); 
} 

double ClassA::ff(){ 
    return 1; 
} 

double InterfaceToA::g(double arg1, double arg2){ 
    return (arg1 + thing1) - (arg2 + thing2) + ff(); 
} 

//Main function 
int main(){ 
    ClassA myClassA; 

    myClassA.thing1 = 1; 
    myClassA.thing2 = 3; 

    double output; 

    output = myClassA.f(5,1); 

    std::cout << str(output) << std::endl; 

    return 0; 
} 

où dans ce cas prévu output serait 3, (5+1) - (1+3) + 1 = 3. Est-ce possible en C++, j'ai essayé de penser à cela en utilisant à la fois l'héritage et les classes imbriquées, mais je peux très bien comprendre comment procéder.

+0

Et la question est? Je ne comprends absolument pas où vous avez un problème, peut-être http://ideone.com/ZXils? – Arpegius

+0

On ne sait pas quelle est votre question. Normalement une interface comme 'InterfaceA' serait quelque chose que' ClassA' implémente. Alternativement, l'interface pourrait contenir une instance de 'ClassA' en tant que membre, puis utiliser cette instance dans des méthodes comme' InterfaceToA :: g' pour calculer les résultats. –

+0

Ma question est: est ce que j'ai besoin de faire et proposé ci-dessus valide/légal? – johntfoster

Répondre

0

J'ai été capable de le comprendre. Je devais passer une référence à ClassA en InterfaceToA::g. Le code compilable final est inférieur à

#include<iostream> 

// Class declarations 
class ClassA { 
    public: 
    double thing1; 
    double thing2; 
    double f(double arg1, double arg2); 
    double ff(); 
}; 

class InterfaceToA : public ClassA { 
    public: 
    double g(ClassA &myClass, double arg1, double arg2); 
}; 

// Class implementations 
double ClassA::f(double arg1, double arg2){ 
    InterfaceToA interface; 
    return interface.g(*this,arg1,arg2); 
} 

double ClassA::ff(){ 
    return 1; 
} 

double InterfaceToA::g(ClassA & myClass, double arg1, double arg2){ 
    return (arg1 + myClass.thing1) - (arg2 + myClass.thing2) + myClass.ff(); 
} 

//Main function 
int main(){ 
    ClassA myClassA; 

    myClassA.thing1 = 1; 
    myClassA.thing2 = 3; 

    double output; 

    output = myClassA.f(5,1); 

    std::cout << output << std::endl; 

    return 0; 
} 
Questions connexes