1

'dされ、関数で初期化されたchar*配列があります。new通常は使用しますstd::stringが、配列はnullで終了し、複数の可能性が'\0'あるため、フルサイズでキャプチャしたいと思います。

現状では、呼び出し元はこの関数をいつ使用するdelete[]かを覚えておく必要があります。スコープ外になったときにデストラクタで呼び出されるchar *ようにインターフェイスをクリーンアップしたいのですが、何を使用すればよいかわかりません。delete[]取ることができるよりもスマートポインタはありchar *ますか?

編集:

std::stringこれがCスタイルのnullで終了する文字列ではないことが不明確になるため、使用しないでください。これにを使用できますboost::scoped_array<char>か?コピーできないのでscoped_array、それを作成した関数からどのように返すのですか?

4

2 に答える 2

1

これが OO プログラミングのすべてです。上記のようなコメントを使用するstd::stringか、データを処理するクラスを作成します。

class MyObj {
private:
   char *data;
   int len;

public:
   MyObj( const char *data, int len ) {
      this->data = new char[...
      // do what you need here
   }

   const char* getStr() const {
      return data;
   }

   int getLen() const {
      return len;
   }

   ~MyObj() {
      delete [] data;
   }
};

おそらく、コピー コンストラクターと代入演算子を実装する (またはそれらの使用をプライベート化する) ことも必要になるでしょう...

または、 std::string を基本実装として使用しますが、必要なものと方法のみを公開します。

class MyObj : private std::string {
public:
   // whatever you want here
   const char* data() {
      return c_str();
   }

   int length() const {
      return std::string::length();
   }
};
于 2013-01-22T17:45:25.593 に答える
0

2011 年より前は、関数から動的配列を返すための選択肢はstd::stringstd::vector<char>またはboost::shared_array<char>でした。最新の実装では、 も使用できますstd::unique_ptr<char[]>

std::string文字列を表すために使用することをお勧めします。

于 2013-01-22T18:38:55.343 に答える