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

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

ただいまの
回答率

90.50%

  • C++

    4444questions

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

C++ 継承について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 628

TAKAYUKI_MIWA

score 58

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんにちは。

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

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

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

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

class Phone
{
public:
    std::string pInfo;
};

class Worker
{
public:
    Phone phone;
};

class Sales : public Worker
{
public:
//  Phone phone; // Workerから継承して、ここにphoneがあります。
};


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/25 18:10

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/25 18:10

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

    キャンセル

同じタグがついた質問を見る

  • C++

    4444questions

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