0

メソッド GetCurrentStream() が値 *stream を変更する必要がある場合、コンストラクター (以下に示すように) またはメソッド自体のどこに (QFile* および QTextStream*) を動的に割り当てるかについて混乱しています。

ヘッダファイル

class QLogger {
public:
   explicit QLogger();
   ~QLogger();
   QTextStream& GetCurrenStream();
private:
   QFile *file;
   QTextStream *stream;
};

および関連する .cpp で

QLogger::QLogger() {
   file = new QFile;
   stream = new QTextStream;
}

~QLogger() {
   delete file;
   delete stream;
}

QTextStream& GetCurrenStream() {
  ...
  return *stream;
}

そして、デストラクタのどこでストレージを解放しますか?

4

3 に答える 3

2

オブジェクトが構築される瞬間に必要なすべてのデータをオブジェクトに提供できる場合は、実際のオブジェクトを作成するため、すべての初期化をコンストラクターに入れる必要があります。このようにして、オブジェクトを使用するときにオブジェクトの準備が整っていることを確認します。
特別なパターンを使用していない場合、getter は返されるオブジェクトを作成するのではなく、 で行ったように参照を作成する必要がありますGetCurrentStream()

次に、デストラクタを使用すると、これが割り当てられたオブジェクトからメモリを解放する実際の場所になります。危険な割り当て解除プロセスがある場合は、デストラクタで何かが失敗するとメモリ リークが発生するため、追加のメソッドを提供する必要があります。また、デストラクタで例外をスローしないでください。

オブジェクトへのポインターを変更する必要がある場合 ( のようにGetCurrentStream()、ストリームを変更するための別のメソッドを提供し、このメソッドで必要な割り当て解除を処理する必要があります)。
また、次のようなポインターへの参照を返すことを忘れないでください

return *stream; //return reference to actual object, not the pointer!

全体として、あなたがそこで何をしたかは問題ないようです。

于 2013-08-12T10:05:59.223 に答える
1

スマート ポインターを使用して、動的に割り当てられたオブジェクトを管理することを検討してください。

Qt では使用できますQScopedPointer(C++11 には もありますstd::unique_ptr)。

(上記のコメントでも述べたように: Q* 名は基本的に Qt のものによって予約されています。)

class Logger {
public:
   Logger();
   QTextStream& getCurrenStream();
private:
   QScopedPointer<QFile> file;
   QScopedPointer<QTextStream> stream;
};

Logger::Logger()
    : file(new QFile)
    , stream(new QTextStream)
{
}

QTextStream& getCurrenStream() {
  // ...
  return stream.data(); // stream.get() with std::unique_ptr
}

メモリはスマート ポインターによって自動的に割り当て解除されます (QSharedPointer追加std::shared_ptrの参照カウントがあるため、共有ポインターのコピーが存在する間はメモリの割り当てが解除されません)。

于 2013-08-12T10:40:13.013 に答える
1

あなたのしたことは正しいように思えます。コンストラクタでオブジェクトを割り当て、デストラクタで削除します。

ただし、GetCurrentStream()ストリーム オブジェクトへの参照を返すことになっていて、現在ポインターを返しているため、そのままビルドしないでください。

以下のコード サンプルのようなものが欠けている可能性があります。

QTextStream& GetCurrenStream() {
  ...
  return *stream;
}
于 2013-08-12T10:05:16.043 に答える