我想创建一个复数的C++类。这是Complex.h
(最基本的形式(
#ifndef _COMPLEX
#define _COMPLEX
#include "TVector2.h"
class Complex : public TVector2{
public:
Complex(double re, double im): TVector2(re,im){;}
protected:
double m_re;
double m_im;
};
#endif
这是main.cpp
#include "Complex.h"
#include "TVector2.h"
int main() {
Complex c;
}
这是我正在使用的生成文件
CC = g++
CFLAGS = -g -Wall
CFLAGSROOT = `root-config --cflags`
LIBSROOT = `root-config --glibs`
all: Main
Complex.o: Complex.cpp
$(CC) $(CFLAGS) -c Complex.cpp $(CFLAGSROOT)
Main: main.cpp Complex.o
$(CC) $(CFLAGS) -o Main main.cpp Complex.cpp $(CFLAGSROOT) $(LIBSROOT)
clean:
rm *.o
我收到此错误:
main.cpp: In function ‘int main()’:
main.cpp:9:11: error: no matching function for call to ‘Complex::Complex()’
Complex c;
^
以及这些注释:
In file included from main.cpp:2:0:
Complex.h:16:2: note: candidate: Complex::Complex(double, double)
Complex(double re, double im): TVector2(re,im), m_re(re), m_im(im){;}
^~~~~~~
Complex.h:16:2: note: candidate expects 2 arguments, 0 provided
Complex.h:13:7: note: candidate: Complex::Complex(const Complex&)
class Complex : public TVector2{
^~~~~~~
Complex.h:13:7: note: candidate expects 1 argument, 0 provided
Complex.h:13:7: note: candidate: Complex::Complex(Complex&&)
Complex.h:13:7: note: candidate expects 1 argument, 0 provided
Makefile:13: recipe for target 'Main' failed
make: *** [Main] Error 1
编写Complex c;
时 您正在尝试调用构造函数Complex::Complex ()
,这在您的Complex
类中是未定义的,因为唯一可用的构造函数Complex::Complex (double, double)
2 个参数
。因此,有几种方法可以解决此类问题:
只需提供构造函数参数:
Complex c (0, 0);
如果提供构造函数参数看起来太庞大,您可以只提供一个默认构造函数,它对您执行相同的操作:
class Complex : public TVector2 { public: Complex (double re, double im): TVector2 (re, im) {} Complex (): TVector2 (0, 0) {} protected: double m_re; double m_im; };
或者,如果您至少使用 C++-11:
class Complex : public TVector2 { public: Complex (double re, double im): TVector2 (re, im) {} Complex (): Complex (0, 0) {} protected: double m_re; double m_im; };
这将允许您编写
Complex c;
.但是,如果你想编写
Complex c (5);
,除了Complex c;
之外,im
部分的0初始化,可以将这些构造函数参数标记为可选:class Complex : public TVector2 { public: Complex (double re = 0, double im = 0): TVector2 (re, im) {} protected: double m_re; double m_im; };
注意:我不同意从TVector2
继承来表示复数的概念,因为继承表示"is-a"关系,而在我看来复数不是向量(这种向量包含几种对复数没有意义的方法,并且缺少几种方法(。即便如此,您的m_re
和m_im
成员也不会初始化,并且包含不确定的值,在这种情况下,使用此类值会导致未定义的行为。
考虑到这一点并进行更改,因此它不会从TVector2
继承,因此的代码片段将更改为:
(2(:
class Complex {
public:
Complex (): m_re (0), m_im (0) {}
Complex (double re, double im): m_re (re), m_im (im) {}
protected:
double m_re;
double m_im;
};
或(如果您至少使用 C++-11(:
class Complex {
public:
Complex (double re, double im): m_re (re), m_im (im) {}
Complex (): Complex (0, 0) {}
protected:
double m_re;
double m_im;
};
(3( :
class Complex {
public:
Complex (double re = 0, double im = 0): m_re (re), m_im (im) {}
protected:
double m_re;
double m_im;
};
或者,除非此类代码用于学习目的,否则您可以使用std::complex
.