hageking
@hageking

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C++で複数のクラスから同じクラスを操作する方法

Q&A

Closed

解決したいこと

下の画像のように,class_2 ~ class_5からclass_1の内容をすべて共有したいです。
class_1にはprivateに変数があり、publicにクラス内の変数を操作する関数があります。

image.png

C++のクラスについて理解をあまりできていないのでわかる方がいたら教えていただけると嬉しいです。

0

4Answer

Comments

  1. @hageking

    Questioner

    ありがとうございます。
    詳しく調べてやってみます。

class_1のどんな内容を共有したいかを明確に示してください.
実データを共有するのであれば,インスタンスを共有すればよいので,通常クラス定義で特殊なことをする必要はありません.

同様のメンバ構造を持ちたいということであれば,継承を用いることになります.

1Like

Comments

  1. @hageking

    Questioner

    わかりました。
    回答ありがとうございました。

「内容をすべて共有したい」の意味が二つ解釈できます。

  1. クラス1のメンバを全て保有する別のクラスを作りたい。(例)「Personクラス(人名と年齢を保存)があるとして、Studentクラス(人名、年齢に加えて成績も保存)やTeacherクラス(人名、年齢に加えて勤務年数を保存)を作りたい」
    →継承という機能を使う。
  2. クラス1内にあるとあるパラメータをまるでグローバル変数の様に共有したい(例)「Personクラス内にある"number"という全登場人物の数をカウントする変数を使いたい」
    →staticメンバを利用する。

他の方も書かれているように、質問の意味が明確でないと解答できません。具体的にどういう事がしたいのか明記したほうが、質問主様にとっても解答者にとっても意味があるディスカッションが出来ると思います。

前置きが長くなりましたが、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;
}

長文失礼しました。参考になれば幸いです。

1Like

Comments

  1. @hageking

    Questioner

    僕がやりたかったのは2の方法です。
    大変わかりやすい回答ありがとうございました。
  2. 参考になったようで何よりです。
    注意点として、staticメンバ(例でいう所のnumber)は、あたかもグローバル変数のようにふるまうので、初期値の設定はクラスの外で行う必要があります。
    例では`int Person::number=0;`と初期値を0に設定している行があります。
    そこだけ気を付けましょう。(僕はこれで何度もエラーを出したことがあります汗)

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌