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

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

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

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

Q&A

解決済

2回答

1450閲覧

継承プログラムの改善

sukiyaki

総合スコア15

C++

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

0グッド

0クリップ

投稿2017/01/02 13:03

###前提・実現したいこと
同じ変数を持つ複数のクラスで変数の値をセットし計算に使いたいです。
現状では継承を用いて、親クラス、子クラスでそれぞれセットしています。
エラーは出ていないのですが、子クラスが増えてくると複雑になってしまいます。もう少し上手くできる方法があれば教えていただきたいです。
理想としては親クラスでセットすることで、子クラスすべてでセットされるようにしたいです。

###該当のソースコード

C++

1#include <iostream> 2using namespace std; 3 4class parent{ 5public: 6 double A; 7 void set_A(double A_){ 8 A=A_; 9 } 10 void show(){ 11 cout << A << endl; 12 } 13}; 14 15class child : public parent { 16public: 17 void show(){ 18 cout << 2*A << endl; 19 } 20}; 21 22int main(int argc, const char * argv[]) { 23 parent ob; 24 child ob1; 25 26 ob.set_A(1.); 27 ob1.set_A(1.); 28 29 ob.show(); 30 ob1.show(); 31 32 return 0; 33} 34

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

obとob1は異なるインスタンスですので、同じparentを使っていてもインスタンスの記憶領域は完全に別途確保されます。つまり、obのメンバ変数Aとob1のメンバ変数Aは異なるメモリに記録されます。そのため、それぞれに設定する必要が有ります。
例えば、下記でも同じ話です。

C++

1parent ob2; 2parent ob3; 3 4ob2.set_A(20.); 5ob3.set_A(30.); 6 7ob2.show(); // 20と表示される。 8ob3.show(); // 30と表示される。

全てのインスタンスで変数を共有したい場合は、static宣言します。

C++

1#include <iostream> 2using namespace std; 3 4class parent{ 5public: 6 static double A; 7 void set_A(double A_){ 8 A=A_; 9 } 10 void show(){ 11 cout << A << endl; 12 } 13}; 14double parent::A=0.0; 15 16class child : public parent { 17public: 18 void show(){ 19 cout << 2*A << endl; 20 } 21}; 22 23int main(int argc, const char * argv[]) { 24 parent ob; 25 child ob1; 26 27 ob.set_A(1.0); // 一旦Aに1.0を設定します。 28 ob1.set_A(1.1); // 1.0が上書きされて1.1に変わります 29 30 ob.show(); // 1.1と表示されます 31 ob1.show(); // 2.2と表示されます 32 33 return 0; 34}

投稿2017/01/02 13:13

Chironian

総合スコア23272

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

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

sukiyaki

2017/01/02 13:45

回答ありがとうございます。無事、希望通りの実装ができました。 変数を共有したい場合はstaticをつけてクラスの外で初期化すればいいということですね。
guest

0

既出の回答もありますが、私からも一言。

まず、「同じ変数」がどういうものであるのかで場合分けが必要です。(サブクラスを含めて)クラスに属するインスタンスに共通の値を保存するならば(スーパークラスの)static変数が適切です。サブクラス毎に異なる値を保存するならばサブクラスのstatic変数が適切です。そして、インスタンスごとに異なる値を保存するならば通常の非static変数が適切です。(スーパークラスで定義するかは詳細に依存します。)

この上で、どのようにして代入するかです。まず、スーパークラスのstatic変数であれば、これはひとつ代入するだけで全てOKです。サブクラスのstatic変数であれば、サブクラスの数だけ必要です。非static変数ならインスタンスの数だけ必要です。この処理をどのようにしてまとめるかが質問の本題だと考えます。

手軽な例としてはスーパークラスに仮想関数を用意し、これを窓口にすれば簡単です。(異なる値を代入したい)サブクラスを追加で作成したとしても、この関数をオーバーライドすれば良いだけです。こうしておけばこの窓口関数を呼び出すだけで代入が実現できます。この呼び出しも面倒であるならばコンストラクタに記述すればもっと楽です。

投稿2017/01/02 13:46

HogeAnimalLover

総合スコア4830

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

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

sukiyaki

2017/01/02 14:03

回答ありがとうございます。今回の質問ではここまでのことは考えていなかったのですが、とてもためになりました。今後使うことがありそうなのでしっかり身につけたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問