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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

Q&A

解決済

1回答

1936閲覧

C++で複素数クラスを実現する。

0819Goki

総合スコア24

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

0グッド

0クリップ

投稿2021/02/21 20:48

前提・実現したいこと

C++で複素数クラスを実装しながら、C++のクラスやポインタを理解したい。

発生している問題・エラーメッセージ

C++初心者です。複素数の加減乗除を行うプログラムを書きました。
プログラム上のコンストラクタのコメントアウトを外すと想定通り動作するのですが、コメントアウトするとコンパイルが通らず以下のエラーメッセージが出ます。
プログラム上ではComplex::Complex(double a, double b)のコンストラクタのみを使用しており、、Complex::Complex(Complex* c)を呼び出していないにも関わらず、なぜか削除するとコンパイルが通らないです。なぜこのようなことが起きるのでしょうか。

05:22:31 **** Incremental Build of configuration Debug for project Math **** Info: Internal Builder is used for build g++ -O0 -g3 -Wall -c -fmessage-length=0 -o Complex.o "..\Complex.cpp" g++ -o Math.exe Complex.o Complex.o: In function `ZN7ComplexcoEv': D:\Documents\cpp\Math\Debug/../Complex.cpp:31: undefined reference to `Complex::Complex(Complex*)' Complex.o: In function `ZN7ComplexplES_': D:\Documents\cpp\Math\Debug/../Complex.cpp:32: undefined reference to `Complex::Complex(Complex*)' Complex.o: In function `ZN7ComplexmiES_': D:\Documents\cpp\Math\Debug/../Complex.cpp:33: undefined reference to `Complex::Complex(Complex*)' Complex.o: In function `ZN7ComplexmlES_': D:\Documents\cpp\Math\Debug/../Complex.cpp:34: undefined reference to `Complex::Complex(Complex*)' Complex.o: In function `ZN7ComplexmlEd': D:\Documents\cpp\Math\Debug/../Complex.cpp:35: undefined reference to `Complex::Complex(Complex*)' Complex.o:D:\Documents\cpp\Math\Debug/../Complex.cpp:38: more undefined references to `Complex::Complex(Complex*)' follow collect2.exe: error: ld returned 1 exit status 05:22:32 Build Finished (took 641ms)

該当のソースコード

#Complex.cpp

#include "Complex.h" #include <stdio.h> #include <math.h> #include <string.h> Complex::Complex() { this->a=0; this->b=0; } //ここのコメントアウトを外すとコンパイルが通る。 //Complex::Complex(Complex* c) { // this->a=c->a; // this->b=c->b; //} Complex::Complex(double a) { this->a=a; this->b=0; } Complex::Complex(double a, double b) { this->a=a; this->b=b; } Complex::~Complex() {} Complex Complex::operator ~(){return new Complex(this->a, -this->b);} Complex Complex::operator +(Complex c){return new Complex(this->a+c.a, this->b+c.b);} Complex Complex::operator -(Complex c){return new Complex(this->a-c.a, this->b-c.b);} Complex Complex::operator *(Complex c){return new Complex(this->a*c.a - this->b*c.b, this->a*c.b + this->b*c.a);} Complex Complex::operator *(double v){return new Complex(this->a*v, this->b*v);} Complex Complex::operator /(Complex c){ double v=c.abs2(); return new Complex((this->a*c.a+this->b*c.b)/v, (this->b*c.a-this->a*c.b)/v); } Complex Complex::operator /(double v){return new Complex(this->a/v, this->b/v);} double Complex::abs2(){return this->a*this->a+this->b*this->b;} double Complex::abs(){return sqrt(this->abs2());} int main(){ Complex a=new Complex(3, 2); Complex b=new Complex(1, 7); Complex c=(a+b)*b; printf("(%02f, %02f)\n", c.a, c.b); }

#Complex.h

/* * Complex.h * * Created on: 2021/02/22 * Author: goki0 */ #ifndef COMPLEX_H_ #define COMPLEX_H_ class Complex { public: double a, b; Complex(); Complex(Complex* c); Complex(double a); Complex(double a, double b); virtual ~Complex(); Complex operator ~(); Complex operator+(Complex c); Complex operator-(Complex c); Complex operator*(Complex c); Complex operator*(double v); Complex operator/(Complex c); Complex operator/(double v); double abs2(); double abs(); }; #endif /* COMPLEX_H_ */

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

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

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

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

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

guest

回答1

0

ベストアンサー

new Complex(...) すると Complex* が返ってくる。
コンストラクタ:Complex(Complex*) がないと Complex* から(戻り値である) Complex が作れない。
件の症状はこれが原因です。

new されたComplexがdeleteされないのでメモリ・リークの山。C++はJavaじゃありませんからね。

これ↓でよくない? (newを全部取っ払った)

C++

1#include "Complex.h" 2#include <stdio.h> 3#include <math.h> 4#include <string.h> 5 6Complex::Complex() { 7 this->a=0; 8 this->b=0; 9} 10 11Complex::Complex(double a) { 12 this->a=a; 13 this->b=0; 14} 15Complex::Complex(double a, double b) { 16 this->a=a; 17 this->b=b; 18} 19Complex::~Complex() {} 20 21Complex Complex::operator ~(){return Complex(this->a, -this->b);} 22Complex Complex::operator +(Complex c){return Complex(this->a+c.a, this->b+c.b);} 23Complex Complex::operator -(Complex c){return Complex(this->a-c.a, this->b-c.b);} 24Complex Complex::operator *(Complex c){return Complex(this->a*c.a - this->b*c.b, this->a*c.b + this->b*c.a);} 25Complex Complex::operator *(double v){return Complex(this->a*v, this->b*v);} 26Complex Complex::operator /(Complex c){ 27 double v=c.abs2(); 28 return Complex((this->a*c.a+this->b*c.b)/v, (this->b*c.a-this->a*c.b)/v); 29} 30Complex Complex::operator /(double v){return Complex(this->a/v, this->b/v);} 31 32double Complex::abs2(){return this->a*this->a+this->b*this->b;} 33double Complex::abs(){return sqrt(this->abs2());} 34 35int main(){ 36 Complex a(3, 2); 37 Complex b(1, 7); 38 Complex c=(a+b)*b; 39 printf("(%02f, %02f)\n", c.a, c.b); 40}

投稿2021/02/21 20:58

編集2021/02/22 00:19
episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問