2010-11-14 55 views
3

Disons que j'ai quelque chose de classe vecteur 2D de base commeDonner une implémentation de la fonction plus d'un nom en C++

class vector2 
{ 
    int x, y; 
} 

ces deux valeurs pourraient être utilisées pour représenter une position et une largeur et la hauteur. Est-ce que C++ fournit une solution pour implémenter une fonction telle que vector2::getXpos() et ensuite définir vector2::getWidth() et l'utiliser avec la même implémentation.

Je sais que je pourrais juste faire ces deux fonctions en ligne, mais le compilateur pourrait décider de ne pas aligner ces fonctions. donc si getWidth juste appelé getXpos vous finiriez avec deux appels de fonction.

Un exemple plus relistic de ce que je voudrais l'utiliser pour se getLength() et erm ... getSpan() (penser comme un écran ici pour quand vous dites 40" tv)

Je suppose que cela être un simple cas de quelque chose comme une définition de fonction spéciale ... Je ne trouve this page mais cela sonne comme il est une caractéristique de C ... et un peu d'un hack pour travailler.

EDIT

Je ne parle pas de la mécanique de i fonctions nLigne ... Je veux basicaly faire quelque chose comme fonctionnellement

class MyClass 
{ 
    void ActaullyDoStuff(); 
    public: 
    void foo(){ActaullyDoStuff();} 
    void bar(){ActuallyDoStuff();} 
} 

mais où je peux écrire quelque chose comme

class MyBetterClass 
{ 
    public: 
    void foo(){ /* BLOCK OF CODE */ } 
    void bar(){ /* DO WHAT EVER foo() DOES */ } 
} 

Je veux bar() d'être une autre façon de faire juste foo() pour que le même Le code fonctionnel peut avoir différents noms, plus appropriés selon la situation.

+4

Êtes-vous sûr de vouloir utiliser le même type pour des postes ainsi que les dimensions, juste parce qu'ils se trouvent être * structurellement * le même? Cela me semble être une mauvaise idée. Je définirais deux types distincts. Cela rend les intentions du code client beaucoup plus claires. – fredoverflow

+1

"Je ne pose pas de questions sur la mécanique des fonctions inline ...", peut-être pas ... mais les fonctions inline font ce que vous voulez faire ... – ronag

Répondre

1

Il semble que vous ne pensiez pas à cela de manière orientée objet. Je dois recommander à mjfgates que vous ne voulez vraiment pas faire cela. Ce que vous voulez faire, c'est abstraire l'idée d'un vecteur dans une classe et implémenter les méthodes communes que vous pourriez vouloir utiliser avec un vecteur. En fait, vous pouvez envisager d'implémenter votre exemple de classe ci-dessus en tant que classe "Point", puis avoir une classe "Vector" regroupant deux classes de points. En utilisant votre exemple, votre classe ne serait pas bien définie si elle était utilisée à deux fins différentes. Disons que vous voulez faire une méthode sur une classe pour dessiner vector2. Vous devez savoir quelles instances de vector2 représentent un point de départ et lesquelles représentent une largeur/hauteur. Vous auriez probablement aussi besoin d'une troisième représentation pour représenter la direction. La méthode la plus simple consiste à implémenter le vecteur en termes de getStartPoint, getEndPoint et d'autres méthodes qui effectueront les calculs appropriés pour le vecteur. Ensuite, le consommateur n'a pas besoin de connaître le fonctionnement interne de la classe vector2, il appelle simplement les méthodes pour obtenir les informations dont il a besoin.

0

Votre lien référencé est AFAIK pas une fonctionnalité C non plus, mais quelque chose de spécifique à ce compilateur particulier. C++ fournit un tel mécanisme: il se trouve être des fonctions en ligne! S'inquiéter du fait que le compilateur n'optimise pas l'appel redondant dans une fonction inlineable est définitivement une optimisation prématurée. En ligne, mesurez ensuite si vous vous inquiétez des performances.

Si vous êtes absolument insistant sur éliminer la moindre chance d'un appel redondant, vous pouvez faire quelque chose avec le préprocesseur #define s ... mais attention: les macros ne respectent pas les limites de classe, et vos fichiers d'en-tête vont tôt ou tard sur un autre code sans rapport. Mieux vaut ne pas y aller.

+0

N'oubliez pas que # define-inline'd est une douleur à déboguer! – mmmmmmmm

+0

@rstevens: en effet. Je peux difficilement le recommander, mais c'est un moyen possible mais plus compliqué de réaliser ce que l'on peut faire avec plus d'élégance avec des fonctions en ligne. Si, en effet, vous voulez vraiment ajouter la complexité ** apparente ** (plusieurs noms de fonctions membres) là où elle n'existe pas vraiment. –

2

mais le compilateur peut décider de ne pas en ligne ces fonctions

le compilateur a probablement une bonne raison de le faire.

Je pense que cela ne pose aucun problème, il suffit que la fonction avec le nom alternatif appelle la fonction "real", et le compilateur l'alignera très probablement.

EDIT:

Si cela ne vous convainc pas, il est possible d'utiliser __forceinline en studio visuel. Here est le moyen de forcer en ligne dans GCC.

EDIT2:

class MyBetterClass 
{ 
    public: 
    void foo(){ /* BLOCK OF CODE */ } 
    __forceinline void bar(){ foo(); /* DO WHAT EVER foo() DOES */ } 
} 
-1

, vous voulez donc avoir deux fonctions, sur le même objet, qui renvoient exactement les mêmes données, le même type de données.

Ne faites pas cela. Fournir plus d'un chemin à la même donnée est l'une de ces choses qui semble être pratique pour quiconque utilisera votre objet - jusqu'à ce que vous y pensiez. Qu'est-ce qui se passe est que six mois plus tard, quelqu'un présente un bug dans l'une des deux fonctions, et vous corrigez cette fonction, mais pas l'autre, donc le bug est toujours là. Ou le programmeur qui écrit des clients pour votre objet est conduit à moitié fou en se demandant quelle est la différence entre getLength() et getSpan().

La seule fois que je le ferais serait lors de l'implémentation d'une interface qui nécessite une duplication d'une fonction membre existante. Dans ce cas, la fonction de l'interface va être virtuelle, donc la notion d'inline disparaît de la fenêtre.

+4

Sauf que je ne voulais écrire la fonction qu'une seule fois et lui donner plusieurs noms.Donc, si 'foo' avait un bug et qu'il était corrigé, parce que' bar' est la même fonction, il est corrigé aussi – thecoshman

+0

Mauvaise interprétation de la question, offrant un conseil non-séquentiel à titre de pratique. – Syndog

0

vous pourriez utiliser le préprocesseur #define s .... si vous êtes dans les pires bugs du monde. Vous obtiendrez l'équivalent de la garantie en ligne si vous voulez, ou juste des alias si vous le voulez aussi.

1

En utilisant 11 C++, vous pouvez faire:

//works for non-template non-overloaded functions: 

const auto& new_fn_name = old_fn_name; 

Autres solutions: How do I assign an alias to a function name in C++?

+0

Est-ce que cela devrait fonctionner comme une implémentation de méthode? c'est-à-dire que new_fn_name est en fait 'MyClass :: doStuff()'? – einpoklum