Я пишу программу для проверки конкретного наследования, хотя не могу устранить ошибку компоновщика дубликатов символов, которую возвращает Clang. Насколько я понимаю, повторяющиеся символы всегда являются результатом неправильных включений / охранников. Я трижды проверил мои включения / охранники, но не могу найти никаких ошибок. Может ли дублирующий символ быть результатом чего-то другого, кроме включения охраны? Большое спасибо, по мере того, как я совершенствую свои навыки программирования, я намерен вносить здесь частые вклады.
.час
#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
Обновление: Спасибо всем за вашу помощь. Теперь я понимаю механику.
Вы #include
в ваш .cpp
файл в вашем .h
, что приведет к .cpp
код включается в каждый файл, который использует .h
(отсюда повторяющиеся символы). Вы также злоупотребляете включенными охранниками: только заголовочные файлы должны включать охранников; .cpp
файлы никогда не должны иметь их.
Не включайте cpp
файл в вашем заголовке. Если вы сделаете это, каждая единица перевода, которая включает ваш заголовок, будет заканчиваться определением класса, например, PointArray
приводя к ошибке компоновщика с несколькими определениями.
Удалите это из заголовка.
#ifndef POINTARRAY_CPP
#include "PointArray.cpp"#endif
#endif