-1

2つのクラスがTriangleあり、コンストラクターののプロパティに新しいインスタンスをALine割り当てたいと思います。しかし、私はこのエラーが発生していますALineTriangle

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

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 のアドレスを破棄します (1 回ではなく 3 回)。これはメモリ リークです。ALines が消えることはなく、プログラムが実行されている限り、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 つは、コード内で (暗黙的に) 呼び出されるように、既定のコンストラクターが呼び出されないことです。

于 2012-10-12T18:07:52.637 に答える
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のデフォルトコンストラクターを使用していません。

于 2012-10-12T18:08:28.403 に答える
1

ALine::Aline()宣言しましたが、ALineクラスのデフォルトコンストラクターを実装していません。Triangleコンストラクターがそれを呼び出し、リンカはどのオブジェクトファイルにも実装を見つけません。

于 2012-10-12T18:08:38.457 に答える
1

コード例から、デフォルトのコンストラクターのみの実装を提供できなかったように見えますALine::ALine(point a, point b)。またの実装を提供するALine::ALine()と、このエラーが消えるはずです。

于 2012-10-12T18:07:29.450 に答える