1. ホーム
  2. c++

[解決済み] 非静的メンバ関数の外側での 'this' の無効な使用エラー?

2022-02-17 02:40:14

質問

CCTouchTargetedDelegateをCCSpriteでサブクラス化したクラスで使用しています。 デリゲートメソッドを定義するとき、関数内で"this"を使用することができない。

以前の質問でお答えしたように スコープの解決を使用して、関数にクラス名を使用することができませんでした。 ccTouchBegan' の定義が 'mygames::DragSprite' のどの宣言にも一致しません。

また、.hファイルで関数を宣言しようとしましたが、何も動作しないようです。

私のコードは以下の通りです :-)

.hファイル

#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;
    };
}

.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;
}

エラー画面ショット :-)

何が足りないのでしょうか?

興味本位で

回答で提案されているように、もし

bool DragSprite::ccTouchBegan

この場合でも、delegete関数が呼び出されるのでしょうか? それとも、DragSpriteクラスの関数が呼び出されるだけなのでしょうか?つまり、その関数はまだオーバーライドされるのでしょうか? そうですね... CCTargetedTouchDelegeteで宣言されたメソッドで、抽象的な関数だと思う。

解決方法は?

bool ccTouchBegan(

である必要があります。

bool DragSprite::ccTouchBegan(

は必要ありません。 this を使うことができます。