utilisation invalide de " il " à l'extérieur d'un non-membre statique de la fonction d'erreur?
Je suis en utilisant CCTouchTargetedDelegate avec une Classe de sous-classé par CCSprite.
lors de la définition de délégué méthodes je suis ne pas être en mesure d'utiliser "ce" à l'intérieur des fonctions.
comme répondu sur les questions déjà posées
Je ne pouvais pas le nom de la classe avec la fonction à l'aide de résolution de portée , parce qu'il me donna alors l'erreur de
"Hors-ligne de la définition de "ccTouchBegan" ne correspond pas à la déclaration de 'mygames::DragSprite'"
J'ai aussi essayé de déclarer la fonction .h fichier mais rien ne semble fonctionner.
Mon code est comme ci-dessous :-
.h Fichier
#pragma once
#include "cocos2d.h"
namespace mygames
{
class DragSprite: public cocos2d::CCSprite, public cocos2d::CCTargetedTouchDelegate
{
public:
DragSprite* createWithFile(const char *pszFileName);
bool isTouchingOnSprite(cocos2d::CCPoint touch);
virtual bool init();
bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
static inline cocos2d::CCPoint ccpSub(const cocos2d::CCPoint v1, const cocos2d::CCPoint v2);
private:
bool isDrag;
cocos2d::CCPoint whereTouch;
};
}
.Fichier cpp
#include "DragSprite.h"
using namespace mygames;
bool DragSprite::init()
{
if (!CCSprite::init()) {
return false;
}
whereTouch = cocos2d::CCPointZero;
isDrag = false;
return true;
}
DragSprite* DragSprite::createWithFile(const char *pszFileName)
{
DragSprite *pSprite = new DragSprite();
if (pSprite&&pSprite->initWithFile(pszFileName))
{
cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(pSprite, 0, true);
pSprite->autorelease();
return pSprite;
}
CC_SAFE_DELETE(pSprite);
return NULL;
}
bool DragSprite::isTouchingOnSprite(cocos2d::CCPoint touch)
{
if (this->boundingBox().containsPoint(touch)) {
return true;
}else
{
return false;
}
}
static inline cocos2d::CCPoint ccpSub(const cocos2d::CCPoint v1, const cocos2d::CCPoint v2)
{
return ccp(v1.x-v2.x, v1.y-v2.y);
}
//CCTargetedTouchDelegate
bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
cocos2d::CCPoint touchPoint = pTouch->getLocation();
if (this->isTouchingOnSprite(touchPoint)) {
this->whereTouch = ccpSub(this->position, touchPoint);
return true;
}
return false;
}
L'Erreur Capture D'Écran :-
Ce qui me manque ici ?
JUSTE PAR CURIOSITÉ
COMME suggéré dans les réponses, Si j'utilise
bool DragSprite::ccTouchBegan
Donc, Serait-il encore appeler la delegete fonction ? ou tout simplement de la fonction à partir de mon DragSprite classe. Je veux dire, la fonction sera toujours remplacé ?
bien...
son la méthode déclarée dans CCTargetedTouchDelegete. et je suppose que c'est une fonction abstraite.
DragSprite::
Il vous manque de l'étendue de classe dans le
bool ccTouchBegan
définition.ok je comprends, mais comment dois-je utiliser le pointeur de classe. en fait, je suis le portage de code Objective-C. et il y a eu l'utilisation de "auto" ?
Il y a quelques endroits qui explicite
this
est nécessaire en C++, dans la plupart des autres endroits (y compris ici), elle est considérée comme un mauvais style.OriginalL'auteur Pawan Joshi | 2014-05-05
Vous devez vous connecter pour publier un commentaire.
doit être
Vous ne devriez pas besoin
this
en premier lieu.hmm bonne question, je pense que votre portage manque un élément de plus. En C++ des fonctions virtuelles sont opt-in, à la différence de l'obj-c. Vous souhaitez utiliser
virtual
pour rendre cette méthode "virtuel" de la fonction, il fonctionnera comme en obj-c. en.wikipedia.org/wiki/Virtual_function pour plus d'info. Juste ajoutervirtual
avant la définition de la fonctionOK.. bon, puisque c'est déjà déclaré en CCTargetedTouchDelegate classe dont j'hérite, comme le suivant virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false; }; Dois-je encore besoin de le déclarer dans le .h fichier ? si oui, alors avec ou sans mot-clé virtuel ?
le
virtual
doit être dans la définition de classe, dans le.h
fichierOriginalL'auteur Karthik T
Pourquoi ne pas définir votre fonction en tant que
qui est de savoir comment vous l'avez défini dans le DragSprite classe dans votre .h fichier.
J'aimerais répondre à cette question, mais puisque vous avez aussi spécifiquement demandé à l'autre de deux personnes qui ont répondu à votre question, je vais leur donner un coup de feu en premier. 🙂
eh bien... je n'obtiens pas de réponse satisfaisante à ces commentaires. donc, pourriez-vous svp m'aider à sortir d'ici ?
OriginalL'auteur Michael Dautermann
Ce
définit autonome de la fonction. ce ne peut être utilisé à l'intérieur d'une fonction membre de classe. Pour en faire un membre de la classe que vous l'avez défini, vous devez qualifier le nom:
-=-=-=-=
Je vois tout le monde a sauté à la fois. La syntaxe de l'objectif C est différent. Il utilise
pour spécifier la classe et nécessite un - pour indiquer une non statique de la fonction de membre.
Une autre différence est que l'Objective-C nécessite l'auto référencement pour appeler une fonction membre
C++ ne prend pas en
La prochaine question est de savoir de quoi êtes-vous le portage? Est le code appelant le délégué va être en C++ aussi? Si c'est de l'objective-C, qui va être un problème.
bien.. non elle n'est pas dans l'objectif-C. par le portage, je veux dire que je suis juste en utilisant la logique ici. parce que cocos2d-x et cocos2d-iPhone sont pour la plupart de même. Toutes mes excuses, si je vous a causé toute confusion.
aussi .. je suis très nouveau à cocos2dx et c++. donc juste un conseil, est-ce nécessaire de déclarer une fonction virtuelle(pur) de la classe de base .h fichier trop ?
Oui. C'est une autre différence entre objective-C et C++. Il est plus grand. Toutes les fonctions de membre doit être déclarée dans l'en-tête. Objective-C permet à ses membres d'être définie dans le corps sans déclaration.
OriginalL'auteur user3344003