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

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

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

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

Q&A

解決済

2回答

1997閲覧

C++ 継承について

saito.kaz

総合スコア76

C++

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

0グッド

0クリップ

投稿2016/01/24 12:58

編集2016/01/24 13:00

Worker.cpp で Phoneクラスのオブジェクトをコンポジションとして持っています。
その後、WorkerクラスをSalesクラスで継承しています。

###前提・実現したいこと
Workerクラスでs1.pInfoとして値を表示させたいのですが、エラーが発生しています。string クラスだからダメなのでしょうか。
またこのように継承される値を表示させるときは、char*型として宣言しないと動かないのでしょうか。

C++初心者で、教えてく頂けると幸いです。

###発生している問題・エラーメッセージ
Sales.cpp:33:33: error: no member named 'pInfo' in 'Sales'
cout << "s1.pInfo = " << s1.pInfo << "\n";
~~ ^
1 error generated.
###ソースコード

<Sales.h> #include <string.h> #include "Worker.h" class Sales:public Worker{ public: double profit; char* client; std::string addtionalInfo; Sales(); Sales(double profit, char* client, std::string addtionalInfo, int number, char* name, double salary, bool i, char* plan, std::string pInfo); Sales(const Sales &obj); ~Sales(); void ShowData(Sales s1); }; <Sales.cpp> #include <iostream> #include <string.h> #include "Sales.h" using namespace std; Sales::Sales(double profit, char* client, std::string addtionalInfo, int number, char* name, double salary, bool i, char* plan, std::string pInfo):Worker(number, name, salary, i, plan, pInfo){ this->profit = profit; this->client = new char[100]; strcpy(this->client, client); this->addtionalInfo = addtionalInfo; } Sales::Sales(const Sales &obj){ client = new char[100]; strcpy(client,obj.name); this->profit =obj.profit; this->addtionalInfo=obj.addtionalInfo; } Sales::~Sales(){ } Sales::Sales():Worker(){ this->profit = 100; this->client = new char[100]; strcpy(this->client, "Undifined_client"); this->addtionalInfo="undifined_additionalInfo"; } void Sales::ShowData(Sales s1){ cout << "s1.name = " << s1.name << "\n"; cout << "s1.pInfo = " << s1.pInfo << "\n"; cout << "s1.profit = " << s1.profit << "\n"; cout << "s1.client = " << s1.client << "\n"; cout << " s1.addtionalInfo = " << s1.addtionalInfo << "\n"; cout << " s1.addtionalInfo " << s1.addtionalInfo << "\n"; } int main(){ Sales s1; return 0; } <Worker.h> #include <string.h> #include "Phone.h" class Worker{ public: int number; char* name; double salary; Phone phone; Worker(); Worker(int number, char* name, double salary, bool i, char* plan, std::string pInfo); Worker(const Worker &obj); ~Worker(); }; <Worker.cpp> #include <iostream> #include "Worker.h" using namespace std; Worker::Worker(){ name = new char[80]; strcpy(name, "undifined in Worker con"); number = 0; salary = 0; } Worker::Worker(int number, char* name, double salary,bool i, char* plan, string pInfo):phone(i ,plan ,pInfo){ cout<< " This is Constructor called Worker(int number, char* name, double salary):Phone(bool i, char* plan, string pInfo) " << "\n"; this->number = number; this->name = new char[80]; strcpy(this->name, name); this->salary = salary; } Worker::Worker(const Worker &obj){ name = new char[80]; strcpy(name,obj.name); this->number =obj.number; this->salary = obj.salary; }; Worker::~Worker(){ delete[] name; } /* int main(){ Worker w1; strcpy(w1.name,"Takayuki"); //Worker::Worker(int number, char* name, double salary,bool i, char* plan, string pInfo): w1.number =10; w1.salary = 200; ShowData(w1); //Worker::Worker(int number, char* name, double salary,bool i, char* plan, string pInfo): Worker w2(1000, "name_w2", 1000, false, "plan_w2", "pInfo_w2"); ShowData(w2); return 0; } */ <Worker.h> #include <string.h> #include "Phone.h" class Worker{ public: int number; char* name; double salary; Phone phone; Worker(); Worker(int number, char* name, double salary, bool i, char* plan, std::string pInfo); Worker(const Worker &obj); ~Worker(); }; <Phone.cpp> #include <iostream> #include <string.h> #include "Phone.h" using namespace std; Phone::Phone(){ plan = new char[100]; this->i = false; strcpy(this->plan, "normal"); this->pInfo = "nokia"; } Phone::Phone(bool i, char* plan, string pInfo){ this->plan = new char[100]; this->i = i; strcpy(this->plan, plan); this->pInfo = "nokia"; } Phone::~Phone(){ delete[] plan; } void Phone::ShowPhone(){ cout << " i = " << this->i << "\n"; cout << " plan = " << this->plan <<"\n"; cout << " pInfo = " << this->pInfo <<"\n"; } void Phone::ShowData(){ } /* int main(){ Phone p1; Phone p2(false, "p2","noraml2"); Phone p3(false, "p3","noraml3"); cout << "----------p2.ShowPhone();-------------------" << "\n"; p2.ShowPhone(); cout << "----------p3.ShowPhone();-------------------" << "\n"; p3.ShowPhone(); cout << "-----------------------------" << "\n"; p1.i = false; strcpy(p1.plan,"normal"); p1.pInfo = "nokia"; p1.ShowPhone(); cout << "-----------------------------" << "\n"; p2.ShowData(); return 0; } */ <Phone.h> #include <string.h> class Phone{ public: Phone(); Phone(bool i, char* plan, std::string pInfo); ~Phone(); bool i; char* plan; std::string pInfo; void ShowPhone(); virtual void ShowData(); };

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

Worker.cpp で Phoneクラスのオブジェクトをコンポジションとして持っています。

その後、WorkerクラスをSalesクラスで継承しています。

コンポジションと継承は使い方が異なりますので、同じように使うことはできません。
というか、コンポジションって表現やめた方が良いと思います。混乱するだけです。普通にメンバ変数と呼びましょう。

WorkerクラスはPhone型のメンバ変数phoneを持ってますね。ということは、Workerクラスを継承したSalesクラスもPhone型のメンバ変数phoneを継承して持ってますね。

関連部のみ取り出すと下記のようになってます。

C++

1class Phone 2{ 3public: 4 std::string pInfo; 5}; 6 7class Worker 8{ 9public: 10 Phone phone; 11}; 12 13class Sales : public Worker 14{ 15public: 16// Phone phone; // Workerから継承して、ここにphoneがあります。 17};

このphoneの中にpInfoがあります。
従って、Sales s1;ならば、s1.pInfoではなく、s1.phone.pInfoです。

投稿2016/01/24 13:42

Chironian

総合スコア23272

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

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

saito.kaz

2016/01/25 09:10

いつもありがとうございます。 勉強になります。
guest

0

ミスったらごめんなさい
s1.phone.pInfo?
時間がなくてちゃんと見てないですが・・・WorkerのメンバーとしてPhone phone;がありますから。

投稿2016/01/24 13:29

cateye

総合スコア6851

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

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

saito.kaz

2016/01/25 09:10

動きました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問