我知道这个主题已被覆盖并重新讨论过,但每次我需要做这样的事情时我仍然会陷入困境,互联网上到处都是不同的答案。 所以我决定简单地问一下如何处理这种情况。
假设我有以下课程:
class PETS_EXPORT_API dog
{
public:
dog(std::string name):_name(name){}
~dog(){}
private:
std::string _name;
};
显然这段代码会产生警告,因为我正在尝试导出std :: string。我该如何解决这个问题?
谢谢!
答案 0 :(得分:1)
您不想导出私人成员。只有公共界面。创建一个抽象基类并将其导出。
struct DogInterface
{
virtual string IAmADog(void) = 0; // your public interface goes here
};
// Factory function that creates dogs
extern "C" PETS_EXPORT_API DogInterface* APIENTRY GetDog();
如果您只想导出字符串以进行访问
__declspec(dllexport) const char* MyExportedString()
{
return myString.c_str()
}
答案 1 :(得分:0)
替代Joe McGrath的回答:
如果您真的希望您的客户能够访问Dog
public&受保护的接口, 是否有意义使用抽象接口
隐藏您的原始狗:
class Dog_Impl // your original class
{
public:
Dog_Impl(std::string name):_name(name){}
~Dog_Impl(){}
string::get_name();
private:
std::string _name;
};
将它放入您的API:
class Dog_Impl; // fwd declaration
class PETS_EXPORT_API Dog {
public:
Dog(const char *name);
~Dog();
const char *get_name();
private:
Dog_Impl *pImpl;
};
实施应该简单地通过所有公共&受保护的 pImpl 接口:
Dog::Dog(const char *name)
{
pImpl = new Dog_Impl(name);
}
Dog::~Dog()
{
delete pImpl;
}
const char *Dog::get_name()
{
return pImpl->get_name().c_str();
}