我正在编写一个程序来测试具体的继承,虽然我无法解决Clang返回的重复符号链接器错误。我的理解是重复的符号总是不正确的包含/警卫的结果。我已经检查了我的包含/警卫,但我找不到任何错误。复制符号可能是除了包含警卫之外的其他内容的结果吗?非常感谢,随着我的编程技巧的提高,我打算经常在这里做出贡献。
·H
#ifndef POINTARRAY_H
#define POINTARRAY_H
#include "array.h"
namespace Jules
{
namespace Containers
{
class PointArray: public Array<Point>
{
public:
PointArray(); //default constructor
~PointArray(); //destructor
PointArray(const PointArray& p); //copy constructor
PointArray(const int i); //constructor with input argument
PointArray& operator = (const PointArray& source); //assignment operator
double Length() const; //length between points in array
};
}
}
#ifndef POINTARRAY_CPP
#include "PointArray.cpp"
#endif
#endif
的.cpp
#ifndef POINTARRAY_CPP
#define POINTARRAY_CPP
#include "PointArray.h"
using namespace Jules::CAD;
namespace Jules
{
namespace Containers
{
PointArray::PointArray() : Array<Point>() //default constructor
{
}
PointArray::~PointArray() //destructor
{
}
PointArray::PointArray(const PointArray& p) : Array<Point>(p) //copy constructor
{
}
PointArray::PointArray(const int i) : Array<Point>(i) //constructor with input argument
{
}
PointArray& PointArray::operator = (const PointArray& source) //assignment operator
{
if (this == &source)
return *this;
PointArray::operator = (source);
return *this;
}
double PointArray::Length() const
{
double lengthOfPoints = 0;
for (int i = 0; i < Array::Size()-1; i++)
lengthOfPoints += (*this)[i].Distance((*this)[i+1]);
return lengthOfPoints;
}
}
}
#endif
更新:谢谢大家的帮助。我现在了解机制。
答案 0 :(得分:2)
请勿在标头中加入cpp
文件。如果这样做,包含标题的每个翻译单元最终都会得到类的定义,例如,PointArray
会导致链接器出错,并带有多个定义。
从标题中删除它。
#ifndef POINTARRAY_CPP
#include "PointArray.cpp"
#endif
#endif
答案 1 :(得分:1)
您#include
.cpp
.h
个.cpp
文件,这将导致.h
代码包含在使用.cpp
的每个文件中(因此重复的符号)。你也在滥用包括警卫:只有头文件需要包括警卫; {{1}}文件永远不应该有。