C++ Surcharge Statique de la Fonction avec les Non-Statique de la Fonction
Je voudrais imprimer deux choses différentes en fonction de si une fonction est appelée de façon statique avec Foo::print()
ou d'une instance de Foo foo; foo.print();
EDIT: Voici une définition de classe qui certainement ne fonctionne pas, comme répondu par quelques personnes déjà.
class Foo {
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
Cependant, est-il un bon moyen d'obtenir cet effet? En gros, je voudrais faire:
if(this is a static call)
do one thing
else
do another thing
Formulé d'une autre manière, je sais que PHP peut vérifier si le *this
variable est définie ou non pour déterminer si la fonction est appelée de façon statique. Est-ce que C++ ont la même capacité?
Pourquoi ne pas l'essayer et voir?
les deux versions de
les deux versions de
print()
portent la même signature. Et je ne pense pas qu'ils peuvent être surchargés de cette façon.
OriginalL'auteur Alan Turing | 2011-03-19
Vous devez vous connecter pour publier un commentaire.
Non, c'est directement interdit par la norme:
En outre, il serait de toute façon ambiguë puisqu'il est possible d'appeler des fonctions statiques sur les instances:
Donc il n'y aurait ambiguïté avec ce que vous avez:
Pour répondre à votre question, à savoir si vous pouvez vérifier quelle instance d'une fonction membre est appelé, il y a le
this
mot-clé. Lethis
mot clé de points de l'objet pour lequel la fonction a été appelée. Cependant, lathis
mot clé sera toujours pointer vers un objet c'est à dire qu'elle ne sera jamaisNULL
. Par conséquent, il n'est pas possible de vérifier si une fonction est appelée de façon statique ou non à la PHP.Fridman: je ne pense pas que vous avez demandé à mal. Vous avez demandé "est-ce que C++ ont la même capacité?" et j'ai répondu que vous ne pouvez pas basé sur la norme C++ (définit de la langue).
Je me sens pire et pour le pire à propos de mon phrasé de la question, en particulier le titre. Il y a en fait deux questions. Tout d'abord, si vous pouvez la surcharge statique avec des non-statique. C'est ce QUE vous avez répondu très bien. La deuxième question est de savoir si vous pouvez déterminer s'il existe une instance de la classe associée à l'appel de la fonction statique. Comme vous l'avez dit, vous pouvez utiliser une fonction statique comme ceci:
Foo foo; foo.print();
puis-je accéder à lafoo
exemple à partir de l'intérieur de cet appel àprint();
?Fridman: Ah, d'accord. Vous avez clarifié pour moi, donc ne vous inquiétez pas au sujet de votre phrasé. Je vais répondre à cette partie.
OriginalL'auteur In silico
Ce n'est certainement pas autorisé. Je ne vois pas de moyen propre de la réalisation de cet. Quel est exactement le problème que vous voulez résoudre de cette façon?
vous semblez être un malentendu quoi "statique". Vous pas accès non-variables statiques avec une méthode statique; vous n'êtes pas affaire avec une instanciation de la classe. La seule façon de le faire serait de passer à une instanciation de la classe de la méthode statique.
Je sais que Brian, mais vous pouvez appeler les membres statiques "non-statique", donc au lieu de
Foo::print();
, utilisezFoo foo; foo.print();
Vous n'êtes pas à l'appeler "non statique" ... c'est encore d'appeler la même fonction statique dans la classe, et n'a rien à voir avec l'instance de la classe que vous avez là. Ce n'est pas différent
Foo::print();
Voir: stackoverflow.com/questions/325555/... - je crois que c'est la source de votre confusion.Ah ok, donc l'instance de
foo
dans ce cas n'a pas de sens et ne peut pas être accessible depuis l'intérieur deprint()
. Merci pour cette précision BrianOriginalL'auteur Janick Bernet
Vous ne pouvez pas le faire exactement, voir In silico de la réponse.
Mais vous pouvez faire
Foo::print()
etFoo foo; print(foo);
faire des choses différentes. (Définirvoid print(Foo& foo)
dans le même espace de noms queclass Foo
, il sera trouvé par ADL).En tout cas, ce n'est pas une bonne idée. Vous avez deux fonctions très similaires dans leur nom, qui ne sont des choses complètement différentes, ce qui viole les bons principes de conception.
Les deux fonctions doivent être en train de faire des choses différentes, donc, assurément, l'un d'eux peut avoir un nom différent. Peut-être
Foo::PrintLiveFooCount();
etFoo foo; foo.print();
?OriginalL'auteur Ben Voigt
La réponse est non, parce que vous ne pouvez pas surcharger basé sur un type de retour.
Vous pouvez certainement avoir des méthodes statiques dans une classe, mais vous ne pouvez pas avoir:
Car ils ont la même signature de la méthode.
EDIT: j'ai vu votre commentaire disant pourquoi vous avez voulu faire cela, et que vous vouliez accéder aux variables membres. Vous devez faire ceci:
(Ou de créer des accesseurs et mutateurs Foo, etc, mais c'est l'idée générale)
Foo::print(f)
surf.print()
.OriginalL'auteur Brian Roach