2009-05-18 5 views
2

J'ai un module C qui est créé par l'atelier en temps réel basé sur un modèle Simulink. Ce module propose trois fonctions publiques:Comment modéliser une interface de type OO pour les fonctions C?

int init(); 
int calc(double *inputarray, double *outputarray); 
int term(); 

Basé sur le contenu du outputArray, je peux modéliser une classe appelée OutputThing.

Je souhaite intégrer ces fonctions dans une classe wrapper appelée WrapperModule. En ce moment j'ai une classe qui ressemble à ceci:

class WrapperModule { 
public: 
    int initialize(); 
    OutputThing calc(...); 
    int terminate(); 
}; 

Mon problème est, comment concevoir correctement une méthode d'emballage pour la fonction calc(). Je veux éviter pour créer une méthode avec un tableau/vecteur comme argument unique. Mais identifier le bon argument à partir du vecteur est délicat et je n'aime pas l'idée d'avoir une méthode avec 6 arguments ou plus. Dans son livre OOSC, Bertrand Meyer suggère l'utilisation de méthodes de mise en place. Quelque chose comme:

class WrapperModule { 
public: 
    int initialize(); 
    void set_foo(double f); 
    void set_bar(double b); 
    OutputThing calc(); 
    int terminate(); 
}; 

Des idées? Je ne suis pas sûr quelle approche serait la meilleure.

+0

Dans ma réponse, je suppose que init() est une fonction d'initialisation unique et term() est une fonction de terminaison ponctuelle et que calc() peut être appelée autant de fois entre init() et term(). Est-ce correct? –

Répondre

3

Si vous êtes en mesure de résumer également inputarray à une classe InputThing, je suggère ce qui suit. Ceci encapsule également mieux l'initialisation/terminaison en utilisant la construction/destruction C++.

class WrapperModule { 
public: 
    // Calls init() 
    WrapperModule(); 

    // Calls term() 
    ~WrapperModule(); 

    // Calls calc() 
    OutputThing calculate(const InputThing& inputThing); 
}; 

Si les fonctions nécessaires, InputThing pourrait avoir accesseur et mutateur (get/set) pour l'empêcher besoin d'un constructeur en prenant de nombreux arguments.

+0

InputThing et OutputThing peuvent être std :: vector qui peut être utilisé avec la fonction de style C car il garantit que les éléments sont dans des emplacements de mémoire continue. – Naveen

+1

En outre, je pense qu'il était préférable que InputThing et OutputThing, étroitement couplés à la fonction calculate, soient définis comme une classe interne de la classe WrapperModule. – xtofl

+0

@Naveen Jens suggère dans sa question qu'il y a une certaine structure dans le tableau de sortie qu'il veut modéliser avec OutputThing donc un vecteur de doubles peut ne pas le couper. Cela peut être logique pour InputThing, cependant. –

Questions connexes