質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1449閲覧

C++ コンストラクタからの変数参照

kn59

総合スコア5

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/30 11:26

前提・実現したいこと

C++で複数人の名前と年齢を連続で、最大100人分入力するプログラムを作っています。
年齢に負の値が入ると、100人分入力していなくても、入力を終了するようにします。
コンストラクタで入力を行い、人数をカウントしたいです。

発生している問題・エラーメッセージ

識別子"flag"が定義されていません 識別子"code"が定義されていません

該当のソースコード

C++

1#include <iostream> 2#include <string> 3using namespace std; 4 5class person{ 6public: 7 int age; 8 string name; 9 person(); 10}; 11 12person::person(){ 13 if (flag) { 14 code++; 15 cout << "名前と年齢は?:" << endl; 16 cin >> name >> age; 17 if (age < 0) { 18 flag = false; 19 } 20 } 21} 22 23int main(void) { 24 int num=0; 25 bool flag=true; 26 person w[100]; 27 28 return 0; 29}

試したこと

別のクラスCを用意し、そこでflagとcodeを宣言し、そのCをcとしてインスタンス化し、codeの代わりにc.codeとしたが、“識別子が定義されていません”とのエラーが出た。

補足情報(FW/ツールのバージョンなど)

visual studio 2017
visual C++
windows デスクトップ ウィザード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/30 12:24 編集

publicしか無いのに、構造体でなくクラスを使う意味は? 途中で終わるかも知れない(個数が不定)なら、なぜvector<person>を使わないのでしょう? vector<person>を内包したclassを作り、終了条件と成るflag等の機能はその中に持たせれば良いのでは? ・・・そもそも、コンストラクタは、初期設定をするもなので、処理を埋め込むのはおすすめできません。
guest

回答3

0

ベストアンサー

C++

1#include <iostream> 2#include <string> 3 4class person{ 5public: 6 int age; 7 std::string name; 8 person(); 9 10 static bool flag; 11 static int size; 12}; 13 14bool person::flag = true; 15int person::size = 0; 16 17person::person(){ 18 if (flag) { 19 std::cout << "名前と年齢は?:" << std::flush; 20 std::cin >> name >> age; 21 if (age < 0) { 22 flag = false; 23 } else { 24 ++size; 25 } 26 } 27} 28 29int main(void) { 30 using namespace std; 31 person w[100]; 32 33 for ( int i = 0; i < person::size; ++i ) { 34 cout << w[i].name << ' ' << w[i].age << endl; 35 } 36 return 0; 37}

投稿2019/10/31 00:13

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kn59

2019/10/31 01:13

解決しました。ありがとうございます。
guest

0

解決していますが,

コンストラクタで入力を行い…

という点に強いこだわりがあるのでなければ,
何と言うか,ただ普通に書けばその分苦労も減るのではないでしょうか.

class Person { public: Person( int age, std::string name ) : m_age(age), m_name(name) {} //※データがpublicなのはそのまま int m_age; std::string m_name; }; int _main() { std::vector< Person > Data; for( int i=0; i<100; ++i ) //最大100回の入力 { int age; std::string name; //※終了したいときに「まず無意味に名前を入力してから年齢に負の値を入れる」という手間が何か嫌なので //年齢側から先に入力するようにしたが,それはそれで通常の入力としては順序がキモイ… std::cin >> age; if( age < 0 )break; std::cin >> name; Data.emplace_back( age, name ); } std::cout << "人数=" << Data.size() << "\n"; for( const auto &P : Data ) { std::cout << P.m_age << " " << P.m_name << "\n"; } return 0; }

投稿2019/10/31 01:31

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ローカル変数はその関数の中だけでしか有効ではありません

#ほかにも問題がありそですが

投稿2019/10/30 11:30

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kn59

2019/10/31 01:14

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問