【问题标题】:non-static function acting as static充当静态的非静态函数
【发布时间】:2015-09-29 15:18:14
【问题描述】:

我在托管 c++ 中创建了一个类库。据我所见,任何地方都没有静态函数,但是当从非托管 C++ 代码调用类中的方法时,调试器坚持认为该方法是静态方法。这意味着当我尝试使用“this”调用成员函数时,我得到了 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;
}

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    我不了解非公共继承的所有机制——只是它们很少使用。

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多