Экспортируйте класс с помощью std :: string - PullRequest
2 голосов
/ 25 ноября 2011

Я знаю, что этот предмет был рассмотрен и перефразирован, но я все еще застреваю каждый раз, когда мне нужно сделать что-то подобное, и в Интернете полно разных ответов. поэтому я решил просто спросить, как быть с такой ситуацией раз и навсегда.

Допустим, у меня есть следующий класс:

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

private:
  std::string _name;
};

Очевидно, этот код выдаст предупреждение, потому что я пытаюсь экспортировать std :: string. Как мне решить такую ​​проблему?

спасибо!

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Вы не хотите экспортировать частных участников.Только общедоступный интерфейс.Сделайте абстрактный базовый класс и экспортируйте его.

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()
}
0 голосов
/ 25 ноября 2011

Альтернатива ответу Джо МакГрата:

Если вы действительно хотите, чтобы ваши клиенты имели доступ к Dog общедоступному и защищенному интерфейсу, и не имеет смысл иметь абстрактный интерфейс,

  • Вы можете использовать идиому pImpl , чтобы скрыть закрытый интерфейс.
  • Дополнительно вы можете экспортировать строку в виде символов

Скрыть ваш оригинальный собака :

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