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

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

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

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

Q&A

解決済

2回答

3008閲覧

C++のグローバル変数を使用したテクニック

saito.kaz

総合スコア76

C++

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

0グッド

0クリップ

投稿2016/01/19 16:33

###前提・実現したいこと
現在、下記のコードのように、static変数を用意して、noを自動的にカウントアップしようとしています。
配列を用いた場合、コンストラクタが一回のみなので、カウントアップができません。
何か自動で繰り上げる方法はないでしょうか。
宜しくお願い致します。

###ソースコード

<メインクラス> #include <iostream> #include "string.h" #include "Worker.h" using namespace std; int Worker::no = 0; char* Worker::CompanyName = "ABC"; Worker::Worker(){ this->num; cout << "-------------------" << Worker::no << "\n"; this->salary = 0; strcpy(this->department, "NotDefinedDepartment"); strcpy(this->name, "NotDefinedName"); no++; } Worker::~Worker(){ } Worker::Worker(double salary ,char department[100], char name[100]){ this->num = no; this->salary = salary; strcpy(this->department,department); strcpy(this->name,name); no++; } void Worker::ShowData(){ cout << "no = " << this->no << "\n"; cout << "salary = " << this->salary << "\n"; cout << "department = " << this->department << "\n"; cout << "name = " << this->name << "\n"; } int main(void){ Worker w[3]; for(int i=0 ; i<3 ;i++){ w[i].salary = 100; strcpy(w[i].department, "E"); strcpy(w[i].name, "Takayuki"); } w[0].ShowData(); w[1].ShowData(); } <ヘッダークラス> #include <iostream> #include "string.h" #include "Worker.h" using namespace std; int Worker::no = 0; char* Worker::CompanyName = "ABC"; Worker::Worker(){ this->num; cout << "-------------------" << Worker::no << "\n"; this->salary = 0; strcpy(this->department, "NotDefinedDepartment"); strcpy(this->name, "NotDefinedName"); no++; } Worker::~Worker(){ } Worker::Worker(double salary ,char department[100], char name[100]){ this->num = no; this->salary = salary; strcpy(this->department,department); strcpy(this->name,name); no++; } void Worker::ShowData(){ cout << "no = " << this->no << "\n"; cout << "salary = " << this->salary << "\n"; cout << "department = " << this->department << "\n"; cout << "name = " << this->name << "\n"; } int main(void){ Worker w[3]; for(int i=0 ; i<3 ;i++){ w[i].salary = 100; strcpy(w[i].department, "E"); strcpy(w[i].name, "Takayuki"); } w[0].ShowData(); w[1].ShowData(); }

###補足情報(言語/FW/ツール等のバージョンなど)
paiza.io

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

まず、<ヘッダークラス>側にcppの内容を記載しているようですよ。
なので、推測になりますが、恐らく下記現象が起きていると思います。

Worker w[3];

まず、この文にてデフォルト・コンストラクタ(引数が無いコンストラクタ)が3回呼ばれます。
デフォルト・コンストラクタ(Worker::Worker())を見ると、this->num;となってます。従って、numの値は不定なままです。this->num=no;のミスですね。

次にtoki_tdさんも指摘されているようにShowData()でnoを表示してます。noはそれまでにコンストラクトされた回数のカウンタですので、意図とは違いますよね? ここはnumを表示するべきかと。


【それはさておき】

下記のようなインデントはやめましょう。
ぱっとみて、ShowData()の呼び出し部分までforループの中に入っているようにも見えます。
インデントはこのような構造を把握しやすくするために付けるものですから、構造と一致しないインデントをつけるとバグの元凶になります。

C+++

1for(int i=0 ; i<3 ;i++){ 2 w[i].salary = 100; 3 strcpy(w[i].department, "E"); 4 strcpy(w[i].name, "Takayuki"); 5 } 6 7 w[0].ShowData(); 8 w[1].ShowData();

w[*].ShowData();の頭はfor文の頭と揃えましょう。これを揃えないようなインデントは小学生でも許されないと考えて下さい。


【好みの問題なのですが、この機会に布教(笑)させて下さい】
this->は必要な時以外は付けない方がよいと個人的には考えています。文が(無駄に)長くなり、可読性が劣化しますので。
特にC++はテンプレートにより冗長な記述が発生しやすい言語なので、なかなか悲惨なことになるケースがあります。
this->を付けることでメンバ変数であることを明示的に示しているのだと思いますが、それよりは変数名を工夫(例えば、メンバはmを頭に付け、非メンバはmで始めないなど)した方が、見やすくなりますし、工夫の仕方によってはthis->つけ忘れ対策にもなります。

投稿2016/01/20 00:27

Chironian

総合スコア23272

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

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

saito.kaz

2016/01/20 00:42

ご丁寧な回答ありがとうございます。 非常に分かりやすかったです。
guest

0

コンストラクタで作成した順に通し番号をつけたいというパターンですね?
多分ヘッダは以下のようになっていると思いますが、コンストラクタはそれぞれ呼ばれますしnoはちゃんとカウントアップされていますよ。

Worker()の1行目、this->num; と代入せず意味のない文を書いてるのでそれのせいじゃないかな?
それとShowDataでnumを表示すべきところをnoにしているのも間違っているのかどうか判断できませんが…

C++

1class Worker 2{ 3public: 4 static char* CompanyName; 5 int num; 6 double salary; 7 char department[100]; 8 char name[100]; 9 10 11 Worker(); 12 ~Worker(); 13 Worker(double salary ,char department[100], char name[100]); 14 void ShowData(); 15 16private: 17 static int no; 18}; 19

投稿2016/01/19 16:50

toki_td

総合スコア2850

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

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

saito.kaz

2016/01/20 00:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問