使用std :: string导出类

时间:2011-11-25 05:16:15

标签: c++ stl dllexport

我知道这个主题已被覆盖并重新讨论过,但每次我需要做这样的事情时我仍然会陷入困境,互联网上到处都是不同的答案。 所以我决定简单地问一下如何处理这种情况。

假设我有以下课程:

class PETS_EXPORT_API dog
{
public:
  dog(std::string name):_name(name){}
  ~dog(){}

private:
  std::string _name;
};

显然这段代码会产生警告,因为我正在尝试导出std :: string。我该如何解决这个问题?

谢谢!

2 个答案:

答案 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&受保护的接口, 是否有意义使用抽象接口

  • 您可以使用 pImpl idiom 来隐藏私人界面。
  • 此外,您可以以字符
  • 的形式导出字符串

隐藏您的原始

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(); 
}