从TVector2类派生复杂类:“;对Complex::Complex()的调用没有匹配的函数; < >我想创建一个C++复数类。这里是Complex.h(最基本的形式)

从TVector2类派生复杂类:“;对Complex::Complex()的调用没有匹配的函数; < >我想创建一个C++复数类。这里是Complex.h(最基本的形式),c++,C++,这里是main.cpp #include "Complex.h" #include "TVector2.h" int main() { Complex c; } 这是我正在使用的Makefile CC=g++ CFLAGS=-g-墙 CFLAGSROOT=`root配置--cflags` LIBSROOT=`root配置--glibs` 全部:主要 Complex.o:Complex.cpp $(CC)$(CFLAGS)-c Complex.cpp$(CFLAGSROOT) Main:M

这里是
main.cpp

#include "Complex.h"
#include "TVector2.h"

int main() {

 Complex c;
}
这是我正在使用的Makefile

CC=g++
CFLAGS=-g-墙
CFLAGSROOT=`root配置--cflags`
LIBSROOT=`root配置--glibs`
全部:主要
Complex.o:Complex.cpp
$(CC)$(CFLAGS)-c Complex.cpp$(CFLAGSROOT)
Main:Main.cpp Complex.o
$(CC)$(CFLAGS)-o Main.cpp Complex.cpp$(CFLAGSROOT)$(LIBSROOT)
清洁:
rm*.o
我得到这个错误:

main.cpp:在函数“int main()”中:
main.cpp:9:11:错误:调用“Complex::Complex()”时没有匹配的函数
复合物c;
^
这些注释:

在main.cpp:2:0中包含的文件中:
Complex.h:16:2:note:candidate:Complex::Complex(double,double)
复形(双re,双im):TVector2(re,im),m_re(re),m_im(im){;}
^~~~~~~
Complex.h:16:2:注意:候选者需要2个参数,提供0个
Complex.h:13:7:注:候选者:Complex::Complex(const Complex&)
综合类:公共TVector2{
^~~~~~~
Complex.h:13:7:注意:候选者需要1个参数,提供0个
Complex.h:13:7:注:候选者:Complex::Complex(Complex&&)
Complex.h:13:7:注意:候选者需要1个参数,提供0个
Makefile:13:目标“Main”的配方失败
make:**[Main]错误1

在编写
Complex c;
时,您试图调用构造函数
Complex::Complex()
,该构造函数在
Complex
类中未定义,因为唯一可用的构造函数接受两个参数
Complex::Complex(double,double)

因此,有两种方法可以解决这一问题:

  • 只需提供构造函数参数:

    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;
    };
    
    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;
    };
    
    这将允许您编写复杂的c;

  • 但是,如果您想编写
    复杂c(5);
    ,这将0-初始化
    im
    部分,除了
    复杂c;
    ,还可以将这些构造函数参数标记为可选参数:

    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) :

    或者(如果您至少使用C++-11):

    (3) :


    或者,除非这些代码用于学习,否则您可以直接使用。

    在编写
    复杂c;
    时,您试图调用构造函数
    Complex::Complex()
    ,该构造函数在
    Complex
    类中未定义,因为唯一可用的构造函数使用两个参数
    Complex::Complex(double,double)

    因此,有两种方法可以解决这一问题:

  • 只需提供构造函数参数:

    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;
    };
    
    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;
    };
    
    这将允许您编写复杂的c;

  • 但是,如果您想编写
    复杂c(5);
    ,这将0-初始化
    im
    部分,除了
    复杂c;
    ,还可以将这些构造函数参数标记为可选参数:

    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) :

    或者(如果您至少使用C++-11):

    (3) :


    或者,除非这些代码是为了学习,否则您可以直接使用。

    Complex c;
    尝试调用无参数的构造函数(
    Complex::Complex()
    ),而
    Complex
    类拥有的唯一构造函数是
    Complex::Complex(double,double)
    。您可以提供所需的构造函数,也可以提供缺少的参数。事实上,对于复杂c(0,0);它编译是的,因为你提供了构造函数参数。这是我的建议之一。我决定写一个正确的答案,因为答案在注释中没有用处。但是,事实证明,我不能这样做,因为我不知道
    TVector2
    是如何定义的。请提供。从技术上讲,我可以写一个n回答关于构造函数调用的问题,但是,然后您会遇到
    m_re
    ,并且
    m_im
    没有初始化的问题,为了建议正确的解决方案,我需要有
    TVector2
    的定义。从一类实2-向量。这样派生它,然后添加m_re和m_im数据成员是一个非常糟糕的主意。
    complec;
    尝试在没有参数的情况下调用构造函数(
    complei