##環境
環境は、以下の通りです。
言語:c++
環境:VisualStudio2019
##前提
以下のように、ClassAの中に、
テキストファイルをopenし、文字を書き込んで、closeするTxtWriterクラスがあるとします。
c++
1 2class ClassA{ 3public: 4 //! コンストラクタ 5 //! m_pTxtWriterを実体化し、テキストファイルをopenする 6 ClassA(); 7 //! デストラクタ 8 //! テキストファイルをcloseする 9 ~ClassA(); 10 11 //! 処理 12 //! この関数の中でm_pTxtWriterを用いてテキストに書き込む 13 void Process(const short* input, short* output); 14 15private: 16 //! テキスト書き込みクラス 17 TxtWriter* m_pTxtWriter; 18}; 19 20 21/**********************************************/ 22//! TxtWriterクラス 23/**********************************************/ 24//! コンストラクタ 25TxtWriter::TxtWriter(std::string fname, std::string type, char delimiter) : m_sType(type), m_cDelimiter(delimiter) 26{ 27 // 開かなかったらエラーで終了 28 if(fopen_s(&m_fp, fname.c_str(), "w") != 0) 29 { 30 printf("Error! %s can not be opened", fname.c_str()); 31 exit(1); 32 } 33} 34 35//! デストラクタ 36TxtWriter::~TxtWriter() 37{ 38 fclose(m_fp); 39} 40 41//! データを1行書き込み 42template <typename T> 43void TxtWriter::WriteLine(const T* data, const int data_num) 44{ 45 std::string type = m_sType+"%c"; 46 for(int i=0; i<data_num-1; i++) 47 { 48 fprintf_s(m_fp, type.c_str(), data[i], m_cDelimiter); 49 } 50 fprintf_s(m_fp, type.c_str(), data[data_num-1], '\n'); 51}
##やりたいこと
インスタンス化された複数のclassAで、m_pTxtWriterを共通で使用したい。
##質問
m_pTxtWriterをコンストラクタで実体化すると、それぞれのclassAで実体を持つことになるので、上記の実装は良くないということは分かるのですが、どのように実装したら良いのか分かりません。
良い実装方法を教えていただけないでしょうか。
##補足
皆さま、ご回答をありがとうございます。説明不足な点がありましたので、補足させていただきます。
classAの仕様として、
・TxtWriterクラスはclassAの所有物である。
・classAを使う人は、classAのProcess関数を呼んだらテキストに出力されることを期待している
(classAを使う人にTxtWriterクラスを準備させたくない)
・複数のclassAインスタンスの出力先は固定
という観点から、外部から与えるのではなく、
ClassAのstaticなメンバ変数としてTxtWriterの実体または参照先(単純ポインタやstd::shared_ptr<TxtWriter>等)を保持する。
という方法が良いかなと考えました。
もし上記の方法で実装する場合、
・TxtWriterクラスは、どのようにしてインスタンス化するのでしょうか?
・注意する点(排他制御が必要)などありましたら、教えていただけないでしょうか。
質問ばかりで申し訳ありませんが、よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/31 03:00 編集
2021/08/31 03:28
2021/08/31 03:45