2016-06-17 121 views
1

我在codeblocks中创建了非常简单的C++项目。我有头文件(CVector.h),源文件(CVector.cpp)和主代码(code.cpp)。当我尝试编译代码我得到了以下信息:没有匹配的调用函数

CVector.cpp|22|error: no matching function for call to 'CVector::CVector()'| 

code.cpp

#include <iostream> 
#include "CVector.h" 
using namespace std; 

int main() { 
CVector vec1(1,2); 
CVector vec2 (3,4); 
cout << "vec1 data "; vec1.printData(); 
cout << "vec2 data "; vec2.printData(); 

cout << "vec1 area: " << vec1.area() << endl; 
cout << "vec2 area: " << vec2.area() << endl; 

return 0; 
} 

CVector.h

#ifndef CVECTOR_H 
#define CVECTOR_H 


class CVector 
{ 
    int x,y; 
    public: 
     CVector (int, int); 
     int area(); 
     void printData(); 
     CVector operator+ (CVector param); 
}; 

#endif // CVECTOR_H 

CVector.cpp

#include <iostream> 
#include "CVector.h" 
using namespace std; 

CVector::CVector (int a, int b) { 
x=a; 
y=b; 
} 

int CVector::area() {return x*y;} 

void CVector::printData(){ 
cout << "X = " << x << ", Y = " << y << endl; 
} 

CVector CVector::operator+ (CVector param) 
{ 
    CVector temp; 
    temp.x=x + param.x; 
    temp.y=y + param.y; 
    return temp; 
} 

该错误与操作员过载有关因为它在我评论这个函数时编译没有问题。

+1

[默认构造函数不是在您明确声明自己的时候自动生成的](http://stackoverflow.com/questions/3734247/what-are-all-the-member-functions-created-by-compiler就像你所做的一样('CVector(int,int)')。 –

+0

是的,我知道,我只是注意到我在运算符重载的定义中需要它。非常感谢你 –

+0

编辑:...当你明确声明**你自己的... –

回答

2

operator+,行

CVector temp; 

需要一个默认的构造函数,但是你没有定义一个。
(如果定义了一个非默认的构造函数,编译器将不会提供一个默认的。)

您可以定义一个默认的构造函数,如果你能在什么成员的合适的默认值可能会决定,或你可以写

CVector CVector::operator+ (CVector param) 
{ 
    CVector temp(x + param.x, y + param.y); 
    return temp; 
} 

甚至

CVector CVector::operator+ (CVector param) 
{ 
    return CVector(x + param.x, y + param.y); 
} 
+0

有一个upvote,为1.第一,和2.显示如何使用现有的ctor。 – Angew

0

operator +的问题是这一行:

CVector temp; 

此行创建一个默认构造的CVector。但是,CVector类没有默认构造函数,因此是错误。你需要添加一个类:

class CVector 
{ 
    int x,y; 
    public: 
     CVector(); // Added 
     //The rest as before 
}; 

有两种方法来实现它。一:

CVector::CVector() {} 

这将导致成员xy剩余未初始化。

二:

CVector::CVector() : x(0), y(0) {} 

这将初始化xy为0

第二个是更安全的,第一个比较快。选择哪一个取决于你的班级目标。


无关,但在你的两个参数的构造函数,你应该使用成员初始化列表,而不是分配,以及:

CVector::CVector(int a, int b) : x(a), y(b) {} 

这并不重要,对于基本类型,如int,但这是一个成长的好习惯。对于具有非平凡默认构造函数的类型的成员,它更有效,对于类型为的成员实际上是有效的,而不使用作为默认构造函数。