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

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

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

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

Q&A

解決済

2回答

3345閲覧

C++ アクセス演算子について

larksiper

総合スコア11

C++

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

0グッド

0クリップ

投稿2017/02/16 02:19

現在、大学でCをある程度学んだので、オブジェクト指向を学びたいと考え、C++をとあるサイト(後述)を参考にソースを書いている途中ですが、エラーが発生し、何故そうなったのかが判らず仕舞いとなっております。
terateilの使用はこれが初めてなので、分かり辛いところがあったらすみません。

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

  • cal.h
#ifndef CALC_H #define CALC_H class FundCalc{ private: double m_num1; double m_num2; public: FundCalc(); void setNum1(double num); void setNum2(double num); double getNum1(); double getNum2(); double add(); double sub(); }; //継承 class NewCalc : public FundCalc{ public: double mul(); double div(); };
  • cal.cpp
#include "cal.h" FundCalc::FundCalc() : m_num1(0),m_num2(0){ } void FundCalc::setNum1(double num){ m_num1 = num; } void FundCalc::setNum2(double num){ m_num2 = num; } double FundCalc::getNum1(){ return m_num1; } double FundCalc::getNum2(){ return m_num2; } double FundCalc::add(){ return m_num1+m_num2; } double FundCalc::sub(){ return m_num1-m_num2; } double NewCalc::mul(){ return m_num1*m_num2; } double NewCalc::div(){ if(m_num2 == 0){ return 0;} return m_num1/m_num2; }
  • prob2.cpp
#include<iostream> #include"cal.h" using namespace std; int main(){ NewCalc n; n.setNum1(40); n.setNum2(20); cout<<n.getNum1() << "+" <<n.getNum2() << "=" << n.add() << endl; cout<<n.getNum1() << "-" <<n.getNum2() << "=" << n.sub() << endl; cout<<n.getNum1() << "*" <<n.getNum2() << "=" << n.mul() << endl; cout<<n.getNum1() << "/" <<n.getNum2() << "=" << n.div() << endl; return 0; }

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

  • 言語 「C/C++」
  • 参考サイト

http://cpp-lang.sevendays-study.com/problem6.html
問題2のところです

  • 環境

ubuntu 16.04 (デュアルブート)

  • コンパイル方法

g++を使用。versionは5.40

コマンド「g++ -o prob2 prob2.cpp cal.cpp」

###発生している問題・エラーメッセージ
FundCalcクラスの関数からのprivate指定の変数へのアクセスが上手く行かない。
以下エラー内容

$ g++ -o prob2 prob2.cpp cal.cpp In file included from cal.cpp:1:0: cal.h: In member function ‘double NewCalc::mul()’: cal.h:6:10: error: ‘double FundCalc::m_num1’ is private double m_num1; ^ cal.cpp:26:10: error: within this context return m_num1*m_num2; ^ In file included from cal.cpp:1:0: cal.h:7:10: error: ‘double FundCalc::m_num2’ is private double m_num2; ^ cal.cpp:26:17: error: within this context return m_num1*m_num2; ^ In file included from cal.cpp:1:0: cal.h: In member function ‘double NewCalc::div()’: cal.h:7:10: error: ‘double FundCalc::m_num2’ is private double m_num2; ^ cal.cpp:29:6: error: within this context if(m_num2 == 0){ ^ In file included from cal.cpp:1:0: cal.h:6:10: error: ‘double FundCalc::m_num1’ is private double m_num1; ^ cal.cpp:31:10: error: within this context return m_num1/m_num2; ^ In file included from cal.cpp:1:0: cal.h:7:10: error: ‘double FundCalc::m_num2’ is private double m_num2; ^ cal.cpp:31:17: error: within this context return m_num1/m_num2; ^

###試したこと
private指定子をpublic指定子に変更すれば(当たり前だが)アクセスは可能。
おそらくアクセスの方法が間違ってる(?)と思うのですが、参考サイトを見た感じでは問題は無い感じですが・・・

よって何が違うのか教えていただけると大変ありがたく思います。

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

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

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

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

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

guest

回答2

0

FunCalcのprivateメンバは、導出クラスNewCalcからもアクセスできません。
private: 改め protected: にすればOK.

投稿2017/02/16 02:26

episteme

総合スコア16614

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

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

0

ベストアンサー

C++でのprivateは、サブクラスに対しても隠蔽されます。サブクラスから使いたい場合は、protectedを指定して下さい。

投稿2017/02/16 02:21

maisumakun

総合スコア145121

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

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

larksiper

2017/02/16 02:25

見たところ仰った通りサブクラスからアクセスしていたため、それらの変更をしたら無事解決しました! お速い回答大変ありがとうございました!
episteme

2017/02/16 02:29

「必要があれば、FundCalcクラスの必要な部分を改造しなさい。」とあるからには、 「参考サイトを見た感じでは問題は無い感じですが」はアテにならんですよ。
larksiper

2017/02/16 02:38

まさに仰ってくれたとおりです。きちんと問題を読む能力とアクセス指定子の使用をきちんと理解していく必要性を感じました・・・ コメントの方ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問