错误:构造函数的多重定义

时间:2011-04-29 13:28:35

标签: c++

请你帮我知道如何避免这个错误.. 提前谢谢。

文件名:point.hh

#ifndef POINT_H
#define POINT_H
class Point{
    private:
        int x;
        int y;
    public:
        Point();
};
#endif

文件名:point.cc

#include "point.hh"
#include <iostream>
using namespace std;
Point::Point()
{
    x=0;
    y=0;
    cout<<"x="<<x;
    cout<<"y="<<y;
}

文件名:main.cc

#include"point.cc"
int main()
{
    Point p;              // calls our default constructor
}

2 个答案:

答案 0 :(得分:16)

您必须在main.cc文件中包含头文件,而不是源文件才能使用Point类。

即,替换:

#include"point.cc"

人:

#include"point.hh"

这背后的基本原理是,除非标记为inline,否则函数定义必须遵守 ODR (“一个定义规则”)。通过将源文件包含在其他源文件中,您最终会在两个不同的翻译单元中对Point::Point()函数进行两个(相同的)定义。

当链接过程发生时,它会看到这两个定义并抱怨:这就是你得到的错误。

答案 1 :(得分:2)

另一个原因是build命令,如果你有两次列出相同的.cpp文件,你肯定会得到这个错误,它会说你甚至没有写的函数都有错误。

将来可能会帮助某人。