2012-01-13 21 views
1

OOPで練習するには、Pointクラス(2つのint、x &)とLineクラス(2つの点を持つ)を作ろうとしています。私は私のmain.cppにを構築するために行くとき私のクラスへの未定義の参照? C++ Beginner

は、今私は..

「ポイント::ポイント(フロート、フロート)」 `未定義の参照 "と

" 未定義のようなエラーが発生します"Line :: Line(Point、Point)"への参照 "

なぜ、おそらくあなたは私のファイルを簡単に見ることができますか?大いに感謝しています!

MAIN.CPP

#include "Point.hpp" 
#include "Line.hpp" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    Point p1(2.0f, 8.0f); // should default to (0, 0) as specified 
    Point p2(4.0f, 10.0f); // should override default 

    p1.setX(17); 


    if (p1.atOrigin() && p2.atOrigin()) 
     cout << "Both points are at origin!" << endl; 
    else 
    { 
     cout << "p1 = (" << p1.getX() << " , " << p1.getY() << ")" <<endl; 
     cout << "p2 = (" << p2.getX() << " , " << p2.getY() << ")" <<endl; 
    } 

    Line line(p1, p2); 
    Point midpoint = line.midpoint(); 
    cout << "p1 = (" << midpoint.getX() << " , " << midpoint.getY() << ")" <<endl; 
    return 0; 
} 

Line.hpp

#ifndef _LINE_HPP_ 
#define _LINE_HPP_ 

#include "Point.hpp" 

class Line{ 
public: 
    Line(Point p1, Point p2); 
    //void setp1(Point p1); 
    //void setp2(Point p2); 
    //Point getp1 finish 

    Point midpoint(); 
    int length(); 

private: 
    int _length; 
    Point _midpoint; 
    Point _p1, _p2; 
}; 

#endif 

Line.cpp

#include "Line.hpp" 
#include <math.h> 

Line::Line(Point p1, Point p2) : _p1(p1), _p2(p2) 
{ 
} 
Point Line::midpoint() 
{ 
    _midpoint.setX() = (_p1.getX()+ _p2.getX()) /2; 
    _midpoint.setY() = (_p1.getY()+ _p2.getY()) /2; 
} 
int Line::length() 
{ 
    //a^2 + b^2 = c^2 

    _length = sqrt(((pow(_p2.getX() - _p1.getX(), 2)) 
        +(pow(_p2.getY() - _p1.getY(), 2)))); 
} 

Point.hpp

#ifndef _POINT_HPP_ 
#define _POINT_HPP_ 

class Point { 
public: 
    Point(float x = 0, float y = 0); 
    float getX() const; 
    float getY() const; 
    void setX(float x = 0); 
    void setY(float y = 0); 
    void setXY(float x = 0, float y = 0); 
    bool atOrigin() const; 

private: 
    float _x, _y; 

}; 

#endif 

C++でPoint.cpp

#include "Point.hpp" 

Point::Point(float x, float y) : _x(x), _y(y) 
{ 
} 

float Point::getX() const 
{ 
    return _x; 
} 
float Point::getY() const 
{ 
    return _y; 
} 
void Point::setX(float x) 
{ 
    //if (x >= 0 && 
    _x = x; 
} 
void Point::setY(float y) 
{ 
    //might want to check 
    _y = y; 
} 
void Point::setXY(float x , float y) 
{ 
    setX(x); 
    setY(y); 
} 
bool Point::atOrigin() const 
{ 
    if (_x == 0 && _y == 0) 
     return true; 

    return false; 
} 
+2

コンパイルにすべてのcppファイルを含めていますか? –

+2

すべてのファイルをリンクしていますか?あなたのコンパイルとリンクのコマンドラインは何ですか? – jpalecek

+0

ああ、今問題が見えます。私はコードブロックのIDEを使用していますが、これまでのところ小さな緑色の再生ボタンをクリックして単一のファイルをコンパイルして実行しています:p私は、コマンドラインを使ってリンクする方法や、コードブロックプロジェクトが機能する可能性があります。おかげで – Holly

答えて

4

だけでなく、あなたがmain.cppをコンパイルする必要がありますが、あなたもあなたのLine.cppPoint.cppファイルをコンパイルする必要がありません。次に、それらをすべてオブジェクトファイルにコンパイルするときは、のオブジェクトファイルをリンクする必要があります。これは、Javaなどの他の言語によって自動的に処理されます。

これを行う方法の正確な手順は、使用している開発環境によって異なります。

+0

ああ、ありがとう! – Holly

3

あなたのPoint.cppがコンパイルされていないか、リンカーに与えられていない場合は、ビルドに含めてみてください。

関連する問題