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

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

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

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

Q&A

解決済

3回答

2534閲覧

C++演算子オーバーロードで虚数計算をしたい

Gustave

総合スコア21

C++

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

0グッド

0クリップ

投稿2016/11/07 06:16

編集2016/11/07 06:19

表題のとおり,C++演算子オーバーロードで虚数計算をするコードを書いています.
虚数型として,ItypeというClassを定義して行っています.

環境はCentOS6.7, gcc4.6.3, コンパイルオプションは使っていません.
実数と虚数同士の全ての演算の組み合わせを実装したいと思っています.
(例えば実数=虚数+虚数なら,実部のみを足して実数に代入)

現在,以下のようなコードを書いているのですが,2つのエラーに悩んでいます.

(1)c = a + bはできるが,c = a + b + aのような多項式ができない

エラー)./src/Itype.cpp(15): エラー: 演算子 "+" がこれらのオペランドと一致しません。
オペランドの型は (Itype + Itype) です。

(2)double = Itype + Itypeが定義できない

エラー: 戻り型のみで識別された関数は多重定義できません。

(2)は多少面倒な方法になっても構いません.
実装方法をご存じの方,教えていただけないでしょうか.

c++

1//header_file 2class Itype 3{ 4 public: 5 double r; 6 double i; 7 Itype() 8 : r(0.0), i(0.0) 9 {} 10 11//arithmetics 12friend Itype operator+( Itype& a, Itype& b); 13friend double operator+( Itype& a, Itype& b); 14};

c++

1// C_file 2Itype operator+( Itype& a, Itype& b){ 3 Itype ans; 4// ..処理.. 5 return ans; 6} 7double operator+( Itype& a, Itype& b);{ 8 double ans; 9// ..処理.. 10 return ans; 11} 12int main(){ 13 Itype a, b, c; 14 a.r=1; 15 a.i=1; 16 b.r=1; 17 b.i=1; 18 c.r=1; 19 c.i=1; 20 a = b + c + a; 21 return(0); 22} 23

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

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

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

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

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

yohhoy

2016/11/07 06:49

C++標準ライブラリで std::complex が提供されていますが、あくまで虚数型を自作したいという趣旨でしょうか?
Gustave

2016/11/07 07:45

そうです.
guest

回答3

0

ベストアンサー

こんにちは。

(1)c = a + bはできるが,c = a + b + aのような多項式ができない

d=a+b+c;を展開すると、d=operator+(operator+(a, b), c);
となります。operator+(a, b)は演算結果なので右辺値です。
右辺値を参照(Itype&)で受けることはできません。
しかし、const参照ならば受け取れます。

(2)double = Itype + Itypeが定義できない

他の方も言っているように戻り値だけが異なるオーバーロードは定義できません。
キャスト演算子を使えば暗黙の型変換できるので、(2)の式だけなら対応できます。
(もう少し複雑な場合に対応できるかどうかは不明です。)

実装です。
なお、rとiをprivateにする必要はないです。これは私の経験的から来る好みです。
operator<<は便利のためです。

C++

1#include <iostream> 2 3class Itype 4{ 5 double r; 6 double i; 7 8public: 9 Itype() : r(0.0), i(0.0) {} 10 Itype(double ir, double ii) : r(ir), i(ii) { } 11 12 operator double() 13 { 14 return r; 15 } 16 17 friend Itype operator+(Itype const& a, Itype const& b) 18 { 19 return Itype(a.r+b.r, a.i+b.i); 20 } 21 22 friend std::ostream& operator<<(std::ostream& ios, Itype const& iRhs) 23 { 24 ios << "(" << iRhs.r << ", " << iRhs.i << ")"; 25 } 26}; 27 28int main() 29{ 30 Itype a(1, 10); 31 Itype b(2, 20); 32 Itype c(4, 40); 33 34 double r = a + b; 35 std::cout << "r=" << r << "\n"; 36 37 a = b + c + a; 38 std::cout << "a=" << a << "\n"; 39 40 return 0; 41}

投稿2016/11/07 08:07

Chironian

総合スコア23272

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

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

0

2番めの方ですが、

エラー: 戻り型のみで識別された関数は多重定義できません。

書いてのとおりで、C++では引数が同じ関数を(返り値だけ変更して)複数定義することはできません。

複素数からdoubleに変換するとして、「絶対値を返す」のか「実部だけ返す」のかはっきりしないので、absreなど、それがはっきりするメソッドを作って、double_val = (c1 + c2).abs;のように使わせるほうが良い設計だと思います。

投稿2016/11/07 06:21

maisumakun

総合スコア145183

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

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

Gustave

2016/11/07 06:30

ありがとうございます. わかりました.
guest

0

で、虚数 + 虚数 のコタエは 虚数なんですか? 実数なんですか?
"どっちになるかは左辺で決まる"は言語仕様上許されませんけど。

投稿2016/11/07 06:23

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問