Ошибка компоновщика дублированного символа в C ++ при правильном включении охранников?

Я пишу программу для проверки конкретного наследования, хотя не могу устранить ошибку компоновщика дубликатов символов, которую возвращает 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

Обновление: Спасибо всем за вашу помощь. Теперь я понимаю механику.

4

Решение

Вы #includeв ваш .cpp файл в вашем .h, что приведет к .cpp код включается в каждый файл, который использует .h (отсюда повторяющиеся символы). Вы также злоупотребляете включенными охранниками: только заголовочные файлы должны включать охранников; .cpp файлы никогда не должны иметь их.

1

Другие решения

Не включайте cpp файл в вашем заголовке. Если вы сделаете это, каждая единица перевода, которая включает ваш заголовок, будет заканчиваться определением класса, например, PointArray приводя к ошибке компоновщика с несколькими определениями.

Удалите это из заголовка.

#ifndef POINTARRAY_CPP
#include "PointArray.cpp"#endif
#endif
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector