Почему при связывании есть неопределенные символы?

У меня два класса Triangle а также ALine и я хочу назначить новый ALine экземпляры свойств Triangle в своем конструкторе.
Но я получаю эту ошибку

Undefined symbols for architecture x86_64:
"ALine::ALine()", referenced from:
Triangle::Triangle(triangle) in Triangle.o
ld: symbol(s) not found for architecture x86_64

Ниже приведен код, который я написал:

ALine.cpp

#include "Geometry.h"#include "ALine.h"ALine::ALine(point a, point b)
{
double tmpy = a.y - b.y;
double tmpx = a.x - b.x;
double tmpk;
if(equals(tmpy, 0))
{
tmpk = 0;
}
else
{
tmpk = tmpx/tmpy;
}
double tmpq = a.y - tmpk*a.x;
if(equals(tmpx, 0))
{
if(equals(a.x, 0))
{
if(equals(b.x, 0)) tmpk = 0;
else tmpk = (b.y-tmpq)/b.x;
}
else
{
tmpk = (a.y-tmpq)/a.x;
}
}a = a;
b = b;
k = tmpk;
q = tmpq;

};

ALine.h

class ALine{

private:
double k;
double q;
point a;
point b;

double length;

void calculateLength();

public:

ALine(point a, point b);
ALine();point getK();
point getQ();static bool areinline(point a, point b, point c);};

Triangle.cpp

#include "Triangle.h"#include "Geometry.h"#include "ALine.h"Triangle::Triangle(triangle t)
{
triangle itself = t;
a = *new ALine(itself.a, itself.b);
b = *new ALine(itself.b, itself.a);
c = *new ALine(itself.c, itself.a);
};

Обратите внимание, что классы не завершены, я вставил сюда только соответствующий код для моей проблемы (если нет, я могу добавить больше).

-1

Решение

Вы объявляете конструктор по умолчанию, но не определяете его.

// in ALine.h
class ALine
{
private:
void calculateLength(); // this is a declaration
public:
ALine(point a, point b); // this is another
ALine(); // this is a declaration as well

...

// in ALine.cpp
ALine::ALine(point a, point b) // this is a definition
{
double tmpy = a.y - b.y;
double tmpx = a.x - b.x;
double tmpk;
...

Вы говорите компилятору, что функция существует, поэтому она позволяет вам использовать ее. Это законно. Однако, когда компоновщик пытается обработать скомпилированный код, он ищет ALine::ALine() и не могу найти его, потому что ты никогда не говорил, что это было.

Добавьте в свой ALine.cpp что-то вроде следующего:

ALine::ALine()
{
}

Вы не используете динамическое распределение правильно. В настоящий момент вы выделяете новый ALine в куче, копируете его в ALine в стеке, а затем отбрасываете адрес ALine кучи (не один, а три раза). Это утечка памяти, линии никогда не исчезают, и пока ваша программа работает, они всегда будут там.

Вам было бы гораздо лучше переодеться Triangle::Triangle(triangle other) к следующему:

Triangle::Triangle(const triangle& t) : a(t.a, t.b), b(t.b, t.c), c(t.c, t.a) {}

Это использует синтаксис Class::Class(args ...) : member(...), member2(...), ... { /* body */ } инициализировать членов класса в конструкторе. Одним из преимуществ этого является то, что их конструкторы по умолчанию не будут вызываться, как они (неявно) в вашем коде.

6

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

Вам нужно реализовать конструктор по умолчанию для класса ALine, Внутри конструктора треугольника, члены a,b а также c используют конструктор по умолчанию и после инициализации используют оператор присваивания (a = *new ALine(itself.c, itself.a);). Возможно, что вы хотите, это:

Triangle::Triangle(const Triangle &t) : a(t.a, t.b), b(t.b, t.c), c(t.c, t.a) {}

Этот код не использует конструктор по умолчанию ALine.

2

Из вашего примера кода видно, что вы не смогли предоставить реализацию для конструктора по умолчанию, только ALine::ALine(point a, point b), Обеспечить реализацию для ALine::ALine() также и вы должны увидеть эту ошибку исчезнуть.

1

Вы объявили, но не реализовали конструктор по умолчанию ALine::Aline() для ALine учебный класс. Ваш Triangle конструктор вызывает его, и компоновщик не находит реализацию ни в одном объектном файле.

1
По вопросам рекламы [email protected]