为什么我在访问fResponse时会在mySubClass2中收到错误?
如何解决我的问题?
class libraryClass : pulic someLibraryBaseClass {
protected:
libraryClass::librarySubClass2 lookUpFunction(int ID) {
//some magic to find the obj
return obj;
}
public:
class librarySubClass2;
class librarySubClass1 {
public:
librarySubClass1(libraryClass baseObj) {
myBaseObj = baseObj;
}
void someCallingFunction(int ID) {
libraryClass::librarySubClass2 obj = myBaseObj->lookUpFunction(ID)
obj->someHandleFunction(this)
cout << fResponse;
}
protected:
friend class librarySubClass2;
unsigned char fResponse[200];
private:
libraryClass myBaseObj;
};
class librarySubClass2 {
protected:
virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
snprintf((char*)obj->fResponse, sizeof obj->fResponse, "Some Text...\r\n"
}
};
};
class myDerivedClass : public libraryClass {
public:
class mySubClass2 : public libraryClass::librarySubClass2;
class mySubClass1 : public libraryClass::librarySubClass1 {
protected:
friend class mySubClass2;
};
class mySubClass2 : public libraryClass::librarySubClass2 {
protected:
virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
libraryClass:librarySubClass2::someHandleFuntion(obj);
snprintf((char*)obj->fResponse, sizeof obj->fResponse, "Add some more Text...\r\n"
}
};
};
编辑:在mySubClass2的方法中忘记*
可能的解决方案:
class mySubClass2 : public libraryClass::librarySubClass2 {
protected:
virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
libraryClass:librarySubClass2::someHandleFuntion(obj);
myDerivedClass::mySubClass1* nowMyObj = (myDerivedClass::mySubClass*) obj;
snprintf((char*)nowMyObj->fResponse, sizeof nowMyObj->fResponse, "Add some more Text...\r\n"
}
};
答案 0 :(得分:0)
现在我派生了类和子类。
在您的示例代码中,您只是派生主类而不是子类。你还必须继承子类:
class libraryClass : pulic someLibraryBaseClass
{
class librarySubClass1 : public someLibraryBaseClass::someLibrarySubClass1 { };
// ....
};
但只有在子类可访问(protected / public)时才能这样做。
答案 1 :(得分:0)
据我所知,你想知道为什么你无法访问<{p>}中的obj->fResponse
void mySubClass2::someHandleFunction(libraryClass::librarySubClass1 obj) { ... }
好吧,obj
的类型为librarySubClass1
,它从共同的祖先继承了fResponse
的份额。但是,这是mySubClass2
的亲戚的份额,而不是你的mySubClass2
!您只能访问已知类型为fResponse
的{{1}}对象成员,而mySubClass
对象实际上并非如此。
访问librarySubClass1
就好像您可以从祖父母那里免费获得叔叔的遗产一样。除非你有一个非常不寻常的家庭在所有家庭成员之间自由分享财富,否则你可能无法获得叔叔的遗产。
答案 2 :(得分:0)
因为mySubClass2中的fResponse被视为受保护,并且此时它在libraryClass之外,它只能在librarySubClass2上工作,因为它位于libraryClass中。