从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