非静态函数充当静态

时间:2015-09-29 15:18:15

标签: c++ static-methods managed-c++ non-static

我在托管c ++中创建了一个类库。据我所知,在任何地方都没有静态函数,但是当从非托管c ++代码调用类中的方法时,调试器坚持认为该方法是静态方法。这意味着当我尝试使用"这个"为了调用成员函数,我得到一个System.NullReferenceException。

有没有人有非静态功能的经验,认为它是静态的?

.h声明

    class __declspec(dllexport) DataManager
    {
    public:
        virtual int DataSize() = 0;
        virtual int DataFileIndexNumber() = 0;
    };

    class __declspec(dllexport) RowIDManager : DataManager
    {
    public:
        virtual int KeyOffset() = 0;
        virtual int KeyFileIndexNumber() = 0;
        virtual bool LoadRecordByKey(int key, HDDBSession hSession = NULL);
    };

    class __declspec(dllexport) Referral : protected REFERRAL_REC, RowIDManager
    {
    private:
        virtual int DataSize() { return sizeof(REFERRAL_REC); }
        virtual int DataFileIndexNumber(){ return FN_REFERRAL_DATA; }
        virtual int KeyOffset(){ return FIELDOFFSET(REFERRAL_REC, ReferralID); }
        virtual int KeyFileIndexNumber(){ return FN_REFERRAL_IDX1; }

    public:
        Referral();
        Referral(const REFERRAL_REC* rec);
        int LoadById(HDDBSession hSession, int refId);

        clip ... other member functions

    };
}

c ++代码

using namespace DataObjectLibrary;


bool RowIDManager::LoadRecordByKey(int key, HDDBSession hSession)
{
    bool retVal = false; 
    HDDBFile hRefFile;

    HDDBSession newSession = hSession;
    if (newSession == NULL)
        newSession = DDB_StartSession(DDB_MULTI_USER);

    hRefFile = DDB_OpenFile(newSession, this->DataFileIndexNumber());
    if (hRefFile)
    { //This if statement throws the exception for the "this->"
        if (DDB_FindRec(hRefFile, this->KeyFileIndexNumber(), &key, this))
            retVal = true;
        DDB_CloseFile(hRefFile);
    }

    if (hSession == NULL)
        DDB_EndSession(newSession);
    return retVal;
}

1 个答案:

答案 0 :(得分:0)

我相信它会抱怨,因为您试图调用不在您范围内的功能。你应该改变这个:

class __declspec(dllexport) RowIDManager : DataManager
...
class __declspec(dllexport) Referral : protected REFERRAL_REC, RowIDManager

到此:

class __declspec(dllexport) RowIDManager : public DataManager
...
class __declspec(dllexport) Referral : protected REFERRAL_REC, public RowIDManager

我不了解非公共遗产的所有机制 - 只是他们很少使用。