读书人

基本概念有关问题请求高人给予详细解

发布时间: 2012-02-14 19:19:19 作者: rapoo

基本概念问题,请求高人给予详细解释,高分回报。
类声明:
class CMyLocation//第一个类
{
public:
CMyLocation();
CMyLocation(int x, int y);
~CMyLocation();
static float MyPointDistance(CMyLocation& firstCMyLocation, CMyLocation& secondCMyLocation);
private:
int iX;
int iY;
};

class CMyLine//第二个类
{
public:
CMyLine(int x0, int y0, int x1, int y1);
~CMyLine();
float MyLineLength();
private:
int iX0;
int iX1;
int iY0;
int iY1;
CMyLocation iStartpoint;
CMyLocation iEndpoint;//声明了前一个类类型的成员变量
};
类定义:
CMyLocation::CMyLocation()//默认构造函数
{
iX = 0;
iY = 0;
}
CMyLocation::CMyLocation(int x, int y)//带参数的构造函数
{
iX = x;
iY = y;
}
CMyLocation::~CMyLocation(){};//析构函数
float CMyLocation::MyPointDistance(CMyLocation& firstCMyLocation, CMyLocation& secondCMyLocation)
{
return sqrt(float((firstCMyLocation.iX - secondCMyLocation.iX) +
(firstCMyLocation.iY - secondCMyLocation.iY)));
}

CMyLine::CMyLine(int x0, int y0, int x1, int y1):iStartpoint(x0, y0),iEndpoint(x1,y1)
{
iX0 = x0;
iX1 = x1;
iY0 = y0;
iY1 = y1;
}
CMyLine::~CMyLine(){};
float CMyLine::MyLineLength()//如果需要使用其它类的成员函数,而没有继承,是不是那个函数必须是静态函数,有无其它方法?
{
return CMyLocation::MyPointDistance(iStartpoint, iEndpoint);
}

问题:
1、如果我使用下面这个方式构造类对象,那么就会出现error C2064: 项不会计算为接受 2 个参数的函数,这是为什么?
CMyLine::CMyLine(int x0, int y0, int x1, int y1
{
iX0 = x0;
iX1 = x1;
iY0 = y0;
iY1 = y1;
iStartpoint(x0, y0);
iEndpoint(x1,y1);
}
2、如果我不定义CMyLocation的默认构造函数,只定义带参数的构造函数,就会产生错误,classtest error LNK2019: 无法解析的外部符号 "public: __thiscall CMyLocation::CMyLocation(void) " (??0CMyLocation@@QAE@XZ) ,该符号在函数 "public: __thiscall CMyCircle::CMyCircle(int,int,int) " (??0CMyCircle@@QAE@HHH@Z) 中被引用

我在CMyLine里面声明了类型为CMyLocation的成员变量,这里只是声明,并没有产生什么动作,怎么会调用构造函数?在CMyLine的构造函数里面构造CMyLocation类型成员,使用了带参数的构造函数,怎么还要默认的?

这是两个毫不相干的类之间的成员定义和使用的问题,我在使用一些api的时候没有遇到过这样的现象。请求帮助。
谢谢。

[解决办法]
2.由于你声明的是一个实体(就不是指针)所以一旦声明并且主类被实体化,这个也被实体化,换句话说就是要开始构造,然而你删除了空构造函数(声明中要求一个默认空构造函数来构造类)所以会出现LINKerror找不到默认空构造函数~
[解决办法]
float CMyLine::MyLineLength()//如果需要使用其它类的成员函数,而没有继承,是不是那个函数必须是静态函数,有无其它方法?
{
return CMyLocation::MyPointDistance(iStartpoint, iEndpoint);
}

----------------

可以不是静态的,比如你把 MyPointDistance 改成不是静态的


1)

CMyLine::CMyLine(int x0, int y0, int x1, int y1
{
iX0 = x0;
iX1 = x1;
iY0 = y0;
iY1 = y1;
iStartpoint(x0, y0);
iEndpoint(x1,y1);
}

改成

CMyLine::CMyLine(int x0, int y0, int x1, int y1
{
iX0 = x0;
iX1 = x1;
iY0 = y0;
iY1 = y1;
iStartpoint = CMyLocation(x0, y0);
iEndpoint = CMyLocation(x1,y1);


}



[解决办法]
To LZ:

在C++当中,当构造一个类的实例的时候,有些事情是在构造函数之前就已经完成了的。这其中就包括,类的各成员变量的实现。

“我在CMyLine里面声明了类型为CMyLocation的成员变量,这里只是声明,并没有产生什么动作,怎么会调用构造函数?”

当你构造CMyLine的实例时,因为它有一个CMyLocation类型的成员变量,因此,在构造函数运行之前,CMyLocation类型的成员变量将会被构造出来。此时,将会调用CMyLocation的默认无参构造函数。

另外,

iStartpoint(x0, y0);
iEndpoint(x1,y1);

这样的写法是想要显式调用构造函数。这个行为在C++中是不允许的。


事实上,C++的一条规则就是,如果一个类作为成员变量类型时,它必须拥有默认无参构造函数。

如果想使用参数来构造成员变量,那么必须写在初始化列表里。

读书人网 >C++

热点推荐