2017-08-13 18 views
0

私は勉強しようとしている初心者です。私は文字列ストリームを "print()"というクラスメンバ関数に送りたいが、エラーが出る。これがうまくいくと、私はそれらをフィードするデータで動作するより多くのクラスメンバ関数を記述することができます。クラスメンバ関数に文字列を渡す

今のところ私はメンバ関数 'print'を持つクラスを作成しました。 "month1.print();"

Month month1 = { "January" }; 
Month month2 = { "February" }; 
Month month3 = { "March" }; 
etc. 

私が呼ぶ:

class Month 
{ 
public: 
string m_month; 

void print() 
{ 
cout << m_month << endl; 
} 

}; 

次は、私が12ヶ月を初期化それは正しい1月を印刷します。

私はstringstreamとforループを使用して月+ 1〜12を連結し、string関数をprint関数に送りたいとします。

stringstream os; 
string mValue = "month"; 
int iValue = 1; 

for(int i = 0; i < 12; ++i) 
{ 
    os << mValue << "" << iValue << "\n"; 
    iValue += 1; 
} 

ただし、文字列を印刷機能と組み合わせることはできません。中

os.print(); and os.str().print(); 

結果:

charににstringstreamを変換し、それを供給する "エラー 'のstd ::にstringstream {別名クラスのstd :: __ cxx11 :: basic_stringstream}' は何という名前のメンバー '印刷' を持っていません"で印刷機能の結果への「エラー: 『constのchar型*』非クラス型であるメンバーのCSTR '内の 『印刷』、要求」:私が何をしようとしています何

const string tmp = os.str(); 
const char* cstr = tmp.c_str(); 

cstr.print(); 

かいつまん月+ 1〜12を連結し、それをクラスメンバ関数 "print"に送ります。これは簡単なことですが、私はそれを動作させることはできません。助言がありますか?

編集:フルコード:

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

class Month 
{ 
public: 
string m_month; 


void print() 
{ 
cout << m_month << endl; 
} 

}; 

int main() 
{ 
Month month1 = { "January" }; 
Month month2 = { "February" }; 
Month month3 = { "March" }; 
Month month4 = { "April" }; 
Month month5 = { "May" }; 
Month month6 = { "June" }; 
Month month7 = { "July" }; 
Month month8 = { "August" }; 
Month month9 = { "September" }; 
Month month10 = { "October" }; 
Month month11 = { "November" }; 
Month month12 = { "December" }; 

stringstream os; // Initialize stringstream "os" 
string mValue = "month"; // Initialize mValue "month" 
int iValue = 1; // Initialize iValue "1" 

for(int i = 0; i < 12; ++i) 
{ 
os << mValue << "" << iValue << "\n"; // Glue mValue and iValue  
// together 
iValue += 1; // Increment iValue by one 
} 

send stringstream "os" to the print function // mock code: Here I want to send month1.print(); month2.print(); etc. to the print function. The output should be January, February etc. 

return 0; 
} 
+0

あなたは 'os.print();'で何をしようとしているのか分かりません。エラーは次のように、printはstringstreamのメソッドではありません。 stringstream文字列を 'm_month'に代入しようとしましたか?また、あなたは月変数を決して使用していません。私はiValueのあなたのループが何をすべきかわからない。どうか明らかにしてください。 – Carcigenicate

+0

待って、mValue for-loopで月オブジェクトを取得しようとしていますか? – Carcigenicate

+0

私はおそらくここで正しい用語を使用していないでしょうが、私はメンバー 'm_month'と 'print'でクラスを作成しています。私は1月12日を初期化しているので、 'month1.print();'それは 'January'を印刷します。 'month2.print();' 2月を印刷します。今のところ、プログラムは 'January、2月、3月など'を印刷し、 'month1.print(); 〜にmonth12.print();それがforループの目的です。それはインクリメントし、 'month1 to 12'を連結して印刷機能に送ります。私は元の投稿に完全なコードを掲載します。 – TwoGoldFish

答えて

1

これは、あなたはそれがないと思う何をしていません。

for(int i = 0; i < 12; ++i) 
{ 
    // iValue is actually unnecessary. You could have just used (i + 1) 
    os << mValue << "" << iValue << "\n"; 
    iValue += 1; 
} 

このすべてが行うには、文字列とにstringstreamを埋めるです:

"month1\nmonth2\nmonth3\nmonth4\nmonth5\nmonth6\nmonth7\nmonth8\nmonth9\nmonth10\nmonth11\nmonth12" 

"month"文字列の末尾に数値を連結して、それらの文字列をth e month1month2 ...上記で定義した変数。それはどのように動作するのではありません。そのような変数を「動的に」参照することはできません。 os.print();には、Monthという変数と同じ名前の文字列が含まれているため、stringstreamはMonthとして機能しません。代わり

、(std::vectorなど)容器のいくつかの種類に変数を追加し、それをループ:

std::vector<Month> months{ month1, month2, month3, ..., month12 } 

for (unsigned int i = 0; i < months.size(); i++) 
{ 
    months[i].print(); 
} 
+0

"あなたの意図は、"月 "文字列の終わりまで数字を連結し、それらがあなたが上で定義したmonth1、month2 ...変数として行動するように思われた..."はい、それは私の意図です。そのためにstd :: vectorを使用していただきありがとうございます。私はそれを試してみましょう。私はPowershellのバックグラウンドから「すべてのことを自動化する」という考え方を持っています。変数を動的に作成する別の理由は、冗長性を避けることによってコードを簡潔に保つことです。 – TwoGoldFish

+0

@TwoGoldFish変数を数値で参照する必要がある場合は、インデックス付きコンテナ( 'vector'など)に入れ、インデックスで参照します。数字以外のもので参照する必要がある場合は、マップに入れて、キーで参照してください。私はPowerShellを知らないのですが、あなたがしようとしていることがPSでの一般的な練習であるならば、あなたは思考を変える必要があります。 Afaikは、デバッグフラグを付けてコンパイルしない限り、コンパイル時にすべての名前情報を失うので、C++ではこれもできません。 – Carcigenicate

+0

すべてを処理するHashMapを使用することもできますが、必ずしも最高のパフォーマンスが得られるわけではありません。標準のライブラリ構造を見てください。このような状況に対処するには、多くのオプションがあります。 – Carcigenicate

0

にstringstreamは、それが起こることを除いて、他のようなストリームとして考えなければなりませんテキストであり、記憶に保持される。文字列に変換するのは安価ですが、実際には文字列を作成するためによく使用されます。

しかし、クラスの「印刷」メソッドは、ストリームがストリングストリームであることを認識していません。注意すべきことは、テキストであるストリームを取得して入力することだけです。事実、前者は、長い道のりを歩む歴史的な弱点のために実施するのが少し難しい。ストリームをバイト単位で読み込み、std :: coutに渡してEOFで終了すると、それはおそらくOKです。

関連する問題