std :: stringを使ってクラスをエクスポートする

私はこの主題がカバーされ、話されたことを知っていますが、私はそのようなことをする必要があるたびに立ち往生し、インターネットはさまざまな答えでいっぱいです。 私はそのような状況にどう対処するのかを尋ねることに決めました。

私は次のクラスを持っていると言うことができます:

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

private:
  std::string _name;
};

明らかに、私はstd :: stringをエクスポートしようとしているので、このコードは警告を生成します。どのように私はそのような問題を解決するのですか?

ありがとう!

2
うん、知って、感謝:-)
追加された 著者 TCS,
不要なコピーを避けるために、 std :: string の代わりに const std :: string&をパラメータとして使用することを忘れないでください。
追加された 著者 Paul Manta,
なぜ民間メンバーを輸出したいのですか?
追加された 著者 Joe McGrath,

2 答え

プライベートメンバーをエクスポートする必要はありません。パブリックインターフェイスのみ。抽象基本クラスを作り、それをエクスポートします。

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
追加された
ちょっと@ジョー、お返事いただきありがとうございます。 "class dog"というインターフェースと "class dog_impl"という実装について、そして新しいDogを返す "class dog_factory"というファクトリクラスについてどう思いますか?
追加された 著者 TCS,
名前はすべてセマンティクスです。重要なのは、プロジェクトで作業しているすべての人の一貫性と合意です。それを超えてそれは良いと思う:)
追加された 著者 Joe McGrath,

ジョー・マクグラスの答えの代わりに:

If you really want your clients to have access to Dog public & protected interface, and does not make sense to have an abstract interface,

  • プライベートインターフェイスを非表示にするには、 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;
};

The implementation should simply pass all public & protected interface to the 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(); 
}
0
追加された