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

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

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

Q&A

解決済

1回答

1161閲覧

c++ operator 演算子の練習 class

_._._ami

総合スコア26

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

0グッド

0クリップ

投稿2020/07/29 01:56

編集2020/07/29 03:06

大幅に書き変えました, すみません.

演算子の練習をしているのですが, 以下のエラーがでてしまいます.
どこを直せば良いですか?

11th.operator.cpp:32:23: error: assigning to 'double' from incompatible type 'A' a3.x = (*this)*s; ~~~~~~~^~ 11th.operator.cpp:45:19: error: member reference base type 'double' is not a structure or union x += a.x;

c++

1#include <iostream> 2 3using namespace std; 4 5class A{ 6 double x; 7public: 8 A operator+(A a) // やりたいこと: (*this) + a; 9 { 10 A a1; 11 a1.x = (*this).x + a.x; 12 return a1; 13 } 14 A operator-(A a) // やりたいこと: (*this) - a; 15 { 16 A a2; 17 a2.x = (*this).x - a.x; 18 return a2; 19 } 20 bool operator>(A a) // やりたいこと: (*this) > a; 21 { 22 return (*this).x > a.x; 23 } 24 bool operator==(A a){ // やりたいこと: (*this) == a; 25 return (*this).x == a.x; 26 } 27 A operator*(double s) // やりたいこと: (*this)*s; 28 { 29 A a3; 30 a3.x = (*this)*s; 31 return a3; 32 } 33 double& operator[](int i){ // やりたいこと: (*this).x = some thing; 34 return (*this).x; 35 } 36 37 A &operator=(const A &a){ // やりたいこと: (*this) = a; 38 (*this).x = a.x; 39 return (*this); 40 } 41 A& operator<<(double a){ // やりたいこと: (*this) << a; 42 43 x += a.x; 44 return (*this); 45 } 46 47}; 48// 以下に正しい出力を示しておく. 49// 1, 2 50// 1 < 2 51// 1 != 2 52// 3, 2 53// 1, 2 54// 2, 2 55// 4 56// 8 57// 10 58// 16 59 60int main(){ 61 A a1, a2; 62 63 a1[0] = 1; 64 a2[-1] = 2; 65 66 cout << a1[-9999] << ", " << a2[0] << "\n"; 67 68 if(a1 > a2){ 69 cout << a1[1651651] << " > " << a2[0] << "\n"; 70 }else{ 71 cout << a1[0] << " < " << a2[0] << "\n"; 72 } 73 74 if(a1 == a2){ 75 cout << a1[0] << " == " << a2[0] << "\n"; 76 }else{ 77 cout << a1[0] << " != " << a2[0] << "\n"; 78 } 79 80 a1 = a1 + a2; 81 cout << a1[0] << ", " << a2[0] << "\n"; 82 83 a1 = a1 - a2; 84 cout << a1[0] << ", " << a2[0] << "\n"; 85 86 a1 = a2; 87 cout << a1[0] << ", " << a2[0] << "\n"; 88 89 a1 = a1*2; 90 cout << a1[0] << "\n"; 91 a1 = a1 + a2*2; 92 cout << a1[0] << "\n"; 93 94 a1 << 2; 95 cout << a1[0] << "\n"; 96 97 a1 << 1 << 2 << 3; 98 cout << a1[0] << "\n"; 99 100 101 return 0; 102}

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

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

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

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

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

kazuma-s

2020/07/29 02:37

class A の定義がないと、何も言えません。 operator* でやることは - でいいんですか?
_._._ami

2020/07/29 03:07

すみませんでした, class A追記しました!
_._._ami

2020/07/29 06:49

できました, ありがとうございました!!
kazuma-s

2020/07/29 07:38

元のコードはそのままで、できたコードを質問に「追記」してもらえますか?
guest

回答1

0

ベストアンサー

おかしなところだらけなので箇条書きとします。

  • A aを引数にすると、演算のたびにコピーが行われてしまいます。a + bbが書き換わるような動作は一般に不適切ですので、const A& aのように、const参照で取るのが一般的です。
  • 通常、比較演算などでオブジェクトは変化しませんので、メソッドもconstにしておきましょう。
  • 同様に、Aを返り値にするとコピーが発生します。*thisを返すようなoperator =の返り値はA&型が適切です。
  • operator>operator ==ifが条件を満たさなかった場合の返り値がありません。
  • operator*(double s)doubleを取っているのに、s.xとプロパティ参照を試みています。
  • operator[]foo[bar]のような添字アクセスの場合に使われるものです。ドットアクセスはオーバーロードできません

投稿2020/07/29 02:08

maisumakun

総合スコア145121

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

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

_._._ami

2020/07/29 03:09

詳しくありがとうございます...!! そうなんですね...知らなかったです. 読む前にA aで全部書いてしまったので一旦それを修正として追記しました. maisumakunさんの回答を参考に書き直してみます!
_._._ami

2020/07/29 06:49

できました, ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問