工具:VS2019
背景:想创建一个C++动态链接库,里面需要用到Point类,但是虽然MFC项目里有CPoint类,但是C++动态链接库里面没有现成的Point类,所以,我准备自己仿照MFC中CPoint类的定义重新写一个,结果第一步就报了如题的错误,
代码如下:
/XXXABC.h
#pragma once
#include <iostream>
using namespace std;
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT;
class Point
{
double X;
double Y;
public:
Point(); //创建一个未初始化的点
Point(double X_Position, double Y_Position); //创建一个已知坐标的点
Point(POINT pointer); //由另一个点创造
public:
double getX();
double getY();
void setX(double X_Value);
void setY(double Y_Value);
double distance(Point p);
};
因为一般情况下,类中不能定义本身类型的成员(PS:之所以说一般情况,是因为看见有人的类中就定义了本身类型的成员,但是我这个菜鸟不会,所以暂时先不研究人家是怎么实现的,先用最基本的方法),这样的话,我的类中的第三个构造函数“由另一个点创造点”就没法实现。所以就有了前面的struct,这样,我的那个构造函数中就可以用"POINT“了,但就是这样还是报了C2011的错。
//看着不是什么大错,我想着这个问题或许可以解决
我也上网找了一下资料,说把上面代码中类定义部分放到namespace{ },我试了一下,确实没有这个错误了,编译也能通过,但是我在 "XXXABC.cpp"(注意上面代码是在“XXXABC.h”中写的)中去丰富这些函数时,从构造函数开始就报了错(代码就不贴了)。
我想着不这么写了,回头问题越冒越多耽误时间不值得,我决定先舍弃我的第三个构造函数”Point(POINT pointer);“了,然后我就把代码从namespace中移了出来,把结构体部分删掉了,代码如下:
/XXXABC.h
#pragma once
#include <iostream>
using namespace std;
class Point:public tagPOINT
{
double X;
double Y;
public:
Point(); //创建一个未初始化的点
Point(double X_Position, double Y_Position); //创建一个已知坐标的点
Point(POINT pointer); //由另一个点创造
public:
double getX();
double getY();
void setX(double X_Value);
void setY(double Y_Value);
double distance(Point p);
};
这一改不得了,我突然发现第三个构造函数中的”POINT“底下竟然没有红色的波浪线,一开始我以为是编译器没反应过来,就“清理解决方案”——>“重新生成解决方案“,竟然也没有报错,可是我确定我代码里没有POINT 的定义,还想这编译器反应也太慢了,都重新生成解决方案了,还是没报错(PS:也不知道我咋想到,咋这么希望人家报错),就把上面这个操作重复做了好几遍,可结果还是编译通过了,我寻思着还是重启吧。
正当我准备退出VS的时候,突然猛地意识到:之前有结构体定义的时候,报错”重定义“,删了之后不报错了,是不是意味着,原本就有个定义好的结构体,我刚好跟人家定义了一模一样的名字,我心里一喜,忙把鼠标放到”POINT"上,“右击”——>“转到定义”,果然看到了对应的定义:
我还因此因祸得福,发现其他好多类似的定义。
总结:所以,这个问题我的解决方法是,将结构体定义部分直接删掉(既然是“重定义”,那必定是定义多了,删了就可,不用想太多,整太多复杂操作)