zac*_*618 2 c++ void void-pointers
简而言之,我创建了多个类来表示来自不同设备(实际上是摄像机)的数据.它们在引擎盖下都有不同的行为,但是交互的构建与外部完全相同.我正在尝试编写一个实用程序函数,可以使用任何一个类,或者可能是我编写的任何类,只要交互是相同的.我对C++很陌生,所以如果我的术语不完全正确,请耐心等待.
所以我要说每个相机都有这些定义.
class CamDataA
{
int getImageStart() {return ptrToStart;)
int getImageSize() {return imageSizeVariable;)
};
class CamDataB
{
int getImageStart() {return ptrToStart;)
int getImageSize() {return width*height*channels;)
};
Run Code Online (Sandbox Code Playgroud)
我希望有另一个单独的类可以与任何一个类互换
class imageUtils
{
//constructors/destructors
int reportSize( void* camData)
{
cout << camData->getImageSize();
}
};
Run Code Online (Sandbox Code Playgroud)
但编译时得到的错误是:
error: ‘void*’ is not a pointer-to-object type
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
void *是一个无类型的指针.要通过指针调用对象的方法,指针必须是适当的类型.您可以明确地转换void *为CamDataA*或者CamDataB*如果您知道它指向哪个对象,但这不是您想要的(您事先不知道对象的类型).
在您的情况下,使用虚拟方法很好.
1)定义一个接口.即定义一组没有实现的方法.
class CamDataBase {
public:
virtual int getImageStart() = 0; // "=0" means abstract methods - MUST be
virtual int getImageSize() = 0; // overriden in descendants
};
Run Code Online (Sandbox Code Playgroud)
关键字virtual表示可以在后代类中重写该方法.这意味着如果我们有一个指针,比如说CamDataBase* p,并且指针指向一些后代类,例如p = new CamDataA(),如果我们写p->getImageStart(),那么将会调用一个方法来对应真实(当前)类型的对象(CamDataA::getImageStart())CamDataBase::getImageStart(),尽管如此,p是一个指针CamDataBase.
2)现在定义接口的几个实现.与父类中的虚方法具有相同签名的方法会覆盖它们.
class CamDataA: public CamDataBase {
int getImageStart() {return ptrToStart;)
int getImageSize() {return imageSizeVariable;)
};
class CamDataB: public CamDataBase {
int getImageStart() {return ptrToStart;)
int getImageSize() {return width*height*channels;)
};
Run Code Online (Sandbox Code Playgroud)
3)现在定义一个接受指针CamDataBase或其任何后代的指针的函数:
void reportSize(CamDataBase* camData) // using the base class
{
// type of the object and the appropriate method
// are determined at run-time because getImageSize() is virtual
std::cout << camData->getImageSize();
}
Run Code Online (Sandbox Code Playgroud)
以下是几个例子:
CamDataA A;
CamDataB B;
reportSize(&A); // CamDataA::getImageSize() is called
reportSize(&B); // CamDataB::getImageSize() is called
CamDataBase *p = &A;
reportSize(p); // CamDataA::getImageSize() is called
// and even if we cast pointer to CamDataA* to a pointer to CamDataB*:
reportSize((CamDataB*)&A); // CamDataA::getImageSize() is called
Run Code Online (Sandbox Code Playgroud)
我希望你能在网上搜索所有新词.:)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |