从 TVector2 类派生复杂类:"No matching function for call to Complex::Complex()"



我想创建一个复数的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 个参数

。因此,有几种方法可以解决此类问题:

  1. 只需提供构造函数参数:

    Complex c (0, 0);
    
  2. 如果提供构造函数参数看起来太庞大,您可以只提供一个默认构造函数,它对您执行相同的操作:

    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;.

  3. 但是,如果你想编写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_rem_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.

最新更新