C++で複数のクラスから同じクラスを操作する方法
解決したいこと
下の画像のように,class_2 ~ class_5
からclass_1
の内容をすべて共有したいです。
class_1
にはprivate
に変数があり、public
にクラス内の変数を操作する関数があります。
C++のクラスについて理解をあまりできていないのでわかる方がいたら教えていただけると嬉しいです。
下の画像のように,class_2 ~ class_5
からclass_1
の内容をすべて共有したいです。
class_1
にはprivate
に変数があり、public
にクラス内の変数を操作する関数があります。
C++のクラスについて理解をあまりできていないのでわかる方がいたら教えていただけると嬉しいです。
https://ja.m.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
スレッドセーフを目指すならロック機構も追加
@hageking
Questioner
class_1のどんな内容を共有したいかを明確に示してください.
実データを共有するのであれば,インスタンスを共有すればよいので,通常クラス定義で特殊なことをする必要はありません.
同様のメンバ構造を持ちたいということであれば,継承を用いることになります.
@hageking
Questioner
「内容をすべて共有したい」の意味が二つ解釈できます。
他の方も書かれているように、質問の意味が明確でないと解答できません。具体的にどういう事がしたいのか明記したほうが、質問主様にとっても解答者にとっても意味があるディスカッションが出来ると思います。
前置きが長くなりましたが、1、2の両方に対応したサンプルプログラミングを組みました。参考になれば幸いです。
以下の例では、名前(name)と年齢(age)を保存するクラス"Person"を最初に定義しています。また、Person内にstaticメンバ「number」というint型の変数があります。
Personのコンストラクタが呼び出された時にnumber++;
とする事で、登場人物の数をカウントアップしています。
その後、class Student:public Person{中略};
と書く事で、Personの機能を保持したまま、それを拡張してテストの点数(score)を保持できるクラスを作りました。
また、Teacherクラスも同様に作成しました。
Personクラス内で定義したnameやageが、その継承者であるStudentクラスやTeacherクラスでも利用できていることが分かります。また、出力結果が
person.getNumPerson()=4
student1.getNumPerson()=4
student2.getNumPerson()=4
teacher.getNumPerson()=4
となっているように、Person内で定義したstaticメンバnumber
がまるでグローバル変数であるがごとく振舞っていることが分かります。
#include <iostream>
#include <string>
class Person{
protected:
std::string name;
int age;
static int number;
public:
Person(std::string n, int a){
name = n;
age = a;
number++;
}
std::string getName(){
return name;
}
int getAge(){
return age;
}
int getNumPerson(){
return number;
}
};
int Person::number=0;
class Student:public Person{
private:
int score;
public:
Student(std::string n, int a, int s):Person(n, a){
score=s;
}
void print(){
std::cout<<name<<"("<<age<<") score="<<score<<std::endl;
}
};
class Teacher:public Person{
private:
int year;
public:
Teacher(std::string n, int a, int y):Person(n, a){
year=y;
}
void print(){
std::cout<<name<<"("<<age<<") year="<<year<<std::endl;
}
};
int main(void){
Person person("Tadasi", 24);
Student student1("Ayumu", 14, 98);
Student student2("Mori", 14, 75);
Teacher teacher("Itou", 30, 2);
std::cout<<"person.getNumPerson()="<<person.getNumPerson()<<std::endl;
std::cout<<"student1.getNumPerson()="<<student1.getNumPerson()<<std::endl;
std::cout<<"student2.getNumPerson()="<<student2.getNumPerson()<<std::endl;
std::cout<<"teacher.getNumPerson()="<<teacher.getNumPerson()<<std::endl;
student1.print();
student2.print();
teacher.print();
/* Expected output
person.getNumPerson()=4
student1.getNumPerson()=4
student2.getNumPerson()=4
teacher.getNumPerson()=4
Ayumu(14) score=98
Mori(14) score=75
Itou(30) year=2
*/
return 0;
}
長文失礼しました。参考になれば幸いです。
@hageking
Questioner
This answer has been deleted for violation of our Terms of Service.