Appel non statique de la variable d'une fonction statique
Je suis un programmeur débutant en C++ et de faire un PoC pour mon entreprise. Donc je m'excuse pour ma question de base.
class TestOne{
private:
TestTwo* t2;
void createInstance(TestTwo* param){
t2 = param;
}
static void staticFunctionToAccessT2(){
//Now here I want to access "t2" here in the current instance of the class
//By current instance I mean "this" in non-static context
//currently there is no function to get object, but can be created
//** we cannot call new TestOne(), because that will create a new instance
//** of the current class and that I don't want.
}
}
Toute aide à ce sujet, seront grandement appréciés.
Grâce
===Mise à JOUR===
Cela peut être pris comme un scénario dans lequel je développe une application en QT Creator, où j'ai une fonction statique de la signature prédéfinie et souhaitez accéder à des éléments de l'INTERFACE utilisateur pour le changement de texte(comme TextEdit)
Tout d'abord, ce n'est pas du C++. Deuxièmement, il ne fait absolument aucun sens pour accéder à certaines per-variable objet sans objet.
Désolé chris, mais je suis en fait un programmeur Java c'est pourquoi j'ai fait l'erreur, je vais mettre à jour le code de l'échantillon. Merci pour le tuyau.
Dans une fonction statique, il n'existe pas d'instance en cours". C'est ce que statique signifie. Si vous voulez qu'il y ait une instance, soit laisser tomber le
En fait, je veux accéder à la T2 à cet endroit, mais ne pouvait pas trouver un solution pour le même. Pouvez-vous s'il vous plaît aider.
Le T2 à quel endroit? Sans objet, vous ne pouvez pas accéder à un objet. La question n'a aucun sens que ce soit.
Désolé chris, mais je suis en fait un programmeur Java c'est pourquoi j'ai fait l'erreur, je vais mettre à jour le code de l'échantillon. Merci pour le tuyau.
Dans une fonction statique, il n'existe pas d'instance en cours". C'est ce que statique signifie. Si vous voulez qu'il y ait une instance, soit laisser tomber le
static
, ou passer de l'un à la fonction de quelque autre manière.En fait, je veux accéder à la T2 à cet endroit, mais ne pouvait pas trouver un solution pour le même. Pouvez-vous s'il vous plaît aider.
Le T2 à quel endroit? Sans objet, vous ne pouvez pas accéder à un objet. La question n'a aucun sens que ce soit.
OriginalL'auteur Jayesh | 2014-11-14
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire cela, même en Java.
static
méthodes sont tout simplement locale des fonctions d'assistance pour toutes les instances de la classe ayant pas accès à l'individu de classe de l'état (par exemplet2
).Soit supprimer le
static
partir de la méthode, ou de faire de la variable membre d'unestatic
variable, en fonction de ce que vous essayez d'accomplir.EDIT:
Si je vous comprends bien votre SDK veut un pointeur de fonction qui il va appeler pour modifier vos instances
t2
. Votre méthode mutateur doit êtrepublic
et nonstatic
. Donc, disons que vous redéfinistaticFunctionToAccessT2
comme ceci:Si l'instance que vous vouliez l'appeler
mutateT2
sur a été définie comme:Où votre SDK veut un pointeur de fonction vous pouvez passer ce dans:
Comme souligné par Mike Seymour ci-dessous cela ne fonctionne que si le SDK paramètre de méthode est un
std::function
pas si son paramètre est un raw pointeur de fonction.bind
résultat; c'est un type de classe, contenant les valeurs soumises, afin de ne pas convertibles en un simple pointeur de fonction. Il n'y a pas de moyen de passer supplémentaires de l'état, si elle ne prend un pointeur de fonction.Cela dépend du type de paramètre. Par exemple Qt sur les fentes d'accepter un
std:function
type, qui accepte la sortie destd::bind
. Je soupçonne que c'est ce que Jayesh a l'aide de sa fonction.En effet, si le paramètre type est
std::function
ou similaire, puis il accepte n'importe quel objet appelable. Mais si elle veut un pointeur de fonction, alors vous ne pouvez pas utiliserbind
, contrairement à la dernière phrase de votre réponse.J'ai édité la réponse pour le souci de l'exactitude.
OriginalL'auteur Jonathan Mee
Une fonction membre statique n'a "aucune instance en cours".
Si vous souhaitez limiter votre classe à n'avoir qu'un seul exemple, vous êtes à la recherche pour le Singleton de conception (anti-)patron, Le pattern Singleton en C++. Il est en fait pas si mal et je me sens toujours une attraction à chaque fois que je travaille avec des classes ayant statique des variables membres.
Il y a un certain nombre d'approches pour rendre le singleton de mieux travailler, de près RAII devrait être votre conduite but ici et j'utilise
std::unique_ptr<TestOne> safeInstance;
alors que je suis en cours d'initialisation dans mongetInstance()
méthode statique, en l'absence d'exceptions dans mon environnement Android.En général, je vous demande instamment de ne pas utiliser le Pattern Singleton si vous avez insuffisant de l'expérience de besoin de poser cette question. Mais il semble répondre à la plupart des questions dans votre question.
De plus, pour appeler les non-statique "variable", je suppose que vous vouliez dire "méthode", votre fonction statique devez travailler avec votre instance du singleton, en supposant il a été créé avec succès. Il peut même accès non-statique variable par le biais de l'instance du singleton.
OriginalL'auteur John
Il n'existe pas d'instance en cours"; vous ne pouvez pas accéder aux non-membres statiques d'une fonction statique sans accès à certains instance de quelque part.
De vos commentaires, il semble que vous êtes en utilisant une fracture de l'API avec un rappel (ou similaire), mécanisme qui ne passe pas les données de l'utilisateur à la fonction que vous fournissez. Dans ce cas, vous allez devoir trouver un autre moyen pour obtenir des données à la fonction; peut-être un membre statique:
donc, l'API peut être utilisé dès lors
Être prudent de ne pas définir
bodge
à une autre valeur jusqu'à ce que l'API a pas fini ce qu'il fait avec votre rappel.Moins cassé API serait de définir un type de callback qui peut prendre un "données utilisateur" paramètre; peut-être un
void*
pointeur, ce qui peut pointer vers des données arbitraires. Vous pouvez l'utiliser ainsi:Une belle moderne API accepterait arbitraire appelable types, de sorte que vous pouvez utiliser un non-statique de la fonction:
OriginalL'auteur Mike Seymour