我有一个C++类(MyClass),它是通过接口(MyClassInterface)访问的,这个类将被编译成一个库,接口将被用作头文件。
我的问题是初始化类。下面的代码将更好地解释:
// myclassinterface.h
#ifndef MYINTERFACE_H
#define MYINTERFACE_H
class MyClassInterface
{
public:
virtual void sayHello() = 0;
};
#endif
// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include "myclassInterface.h"
class MyClass : MyClassInterface
{
public:
void sayHello();
};
#endif
// myclass.cpp
#include "myclass.h"
#include <iostream>
void MyClass::sayHello()
{
std::cout << "Hello from MyClass!" << std::endl;
}
// main.cpp
#include <iostream>
#include "myclassinterface.h"
int main()
{
MyClassInterface *myClass = new MyClass(); // This doesn't compile ( error: expected type-specifier before 'MyClass')
myClass->sayHello();
delete myClass;
return 0;
}
我应该如何示例化类?
我也试过:我的类接口 * 我的类=新的我的类接口();(错误:抽象类类型“MyClassInterface”的new表达式无效)
我有类似的代码工作的Windows dll,我可以初始化它如下:
typedef MyClassInterface *(*DEF)(void);
DEF createInstance = (DEF)::GetProcAddress(hdl, "createInstance");
MyClassInterface = createInstance();
这段代码我需要在Linux中编译
4条答案
按热度按时间u3r8eeie1#
这是因为类的默认继承是私有的,所以你不能从MyClass向上转换到MyClassInterface。
公开遗产继承应该可以解决这个问题。
6qftjkof2#
看起来你需要在
MyClassInterface
中写一个工厂方法。然后可以写入
main
bjg7j2ky3#
你的main.cpp试图访问myclass. h,但它不包含它。把所有的.cpp代码放在同一个文件中,然后编译它,也许它会清除这种情况。
41ik7eoe4#
我相信你想做的是,你有一些类
MyClass
,你希望从你的库的用户封装(为了数据隐藏/API稳定性/等等),你计划通过使用接口MyClassInterface
封装那些实现细节。一个很好的实现方法是使用Pimpl(Pointer to implementation)习惯用法。
我的类.h
我的类.cpp
然后库用户包括
my_class.h
,他们获得您希望通过接口提供的所有函数,他们知道MyClass::impl
类存在,但除此之外什么也不知道。