链接时为什么会出现未定义的符号?

时间:2012-10-12 18:02:50

标签: c++ linker-errors ld

我有两个类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);


};

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);
    };

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

4 个答案:

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

答案 1 :(得分:2)

您需要为类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的默认构造函数。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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