c++ 如何通过接口初始化类

rqmkfv5c  于 2023-03-14  发布在  其他
关注(0)|答案(4)|浏览(200)

我有一个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中编译

u3r8eeie

u3r8eeie1#

这是因为类的默认继承是私有的,所以你不能从MyClass向上转换到MyClassInterface。
公开遗产继承应该可以解决这个问题。

class MyClass : public MyClassInterface{}
6qftjkof

6qftjkof2#

看起来你需要在MyClassInterface中写一个工厂方法。

class MyClassInterface
{ 
public:
    static MyClassInterface* create(); 
    ... 
};

然后可以写入main

MyClassInterface *myClass = MyClassInterface::create();
bjg7j2ky

bjg7j2ky3#

你的main.cpp试图访问myclass. h,但它不包含它。把所有的.cpp代码放在同一个文件中,然后编译它,也许它会清除这种情况。

41ik7eoe

41ik7eoe4#

我相信你想做的是,你有一些类MyClass,你希望从你的库的用户封装(为了数据隐藏/API稳定性/等等),你计划通过使用接口MyClassInterface封装那些实现细节。
一个很好的实现方法是使用Pimpl(Pointer to implementation)习惯用法。

我的类.h

class MyClass {
public:
    MyClass();
    virtual ~MyClass(); // virtual here is a best practice, we're not going to be inheriting from this class anywhere in this example
    void sayHello();
private:
    class impl; // forward declare the implementation so we can use it below
    impl* m_pImpl;
};

我的类.cpp

#include <iostream>

#include "my_class.h"

// here we define the actual class details
class MyClass::impl {
public:
    void sayHello() {
        std::cout << "Hello from MyClass::impl\n";
    }
};

MyClass::MyClass() {
    this->m_pImpl - new MyClass::impl;
}

MyClass::~MyClass() {
    delete this->m_pImpl;
}

void MyClass::sayHello() {
    this->m_pImpl->sayHello();
}

然后库用户包括my_class.h,他们获得您希望通过接口提供的所有函数,他们知道MyClass::impl类存在,但除此之外什么也不知道。

相关问题