我在托管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;
}
答案 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
我不了解非公共遗产的所有机制 - 只是他们很少使用。