-1

我有两个类TriangleALine并且我想将新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);
    
    
};

三角形.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);
    };

注意,类不完整,我在这里只粘贴了与我的问题相关的代码(如果没有,我可以添加更多)。

4

4 回答 4

6

您正在声明一个默认构造函数,但没有定义一个。

// 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 的地址(不是一次,而是 3 次)。这是内存泄漏,ALines 永远不会消失,只要您的程序正在运行,它们就会一直存在。

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 */ }在构造函数中初始化类的成员。这样做的一个好处是不会调用它们的默认构造函数,因为它们会(隐式地)在您的代码中调用。

于 2012-10-12T18:07:52.637 回答
2

您需要为 class 实现默认构造函数ALine。在 Triangle 的构造函数中,成员a,bc使用默认构造函数,并且一旦初始化,它们就使用赋值运算符 ( 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 的默认构造函数。

于 2012-10-12T18:08:28.403 回答
1

从您的代码示例中可以看出,您未能提供默认构造函数的实现,只有ALine::ALine(point a, point b). 为also 提供一个实现ALine::ALine(),您应该会看到此错误消失。

于 2012-10-12T18:07:29.450 回答
1

您声明了,但没有实现该类的默认构造ALine::Aline()函数ALine。您的Triangle构造函数调用它,并且链接器在任何目标文件中都找不到实现。

于 2012-10-12T18:08:38.457 回答