2011-04-29 18 views
1

エラーを回避する方法を教えてください。 ありがとうございます。エラー:コンストラクタの多重定義

ファイル名:point.hh

#ifndef POINT_H 
#define POINT_H 
class Point{ 
    private: 
     int x; 
     int y; 
    public: 
     Point(); 
}; 
#endif 

ファイル名:point.cc

#include "point.hh" 
#include <iostream> 
using namespace std; 
Point::Point() 
{ 
    x=0; 
    y=0; 
    cout<<"x="<<x; 
    cout<<"y="<<y; 
} 

ファイル名:main.cc

#include"point.cc" 
int main() 
{ 
    Point p;    // calls our default constructor 
} 

答えて

15

あなたは、ヘッダファイルをインクルードする必要がありますソースファイルではなく、main.ccファイルにPointクラスを使用してください。

置き換え、次のとおりです、

#include"point.hh" 

inlineをマークしていない限り、この理論的根拠は、その関数定義であるODR(「一つの定義ルールを尊重しなければならない:

#include"point.cc" 

をすることで")。他のソースファイルにソースファイルを含めると、2つの異なる翻訳単位でPoint::Point()関数の2つの(同じ)定義が得られます。

リンク処理が実行されると、この2つの定義が表示され、エラーが表示されます。

+0

これはコンパイラの観点からはどうですか?私はあなたがg ++ main.cc point.ccとcpp main.ccとcpp point.ccの両方でコンパイルしようとしているのは、#includesのために定義が含まれていることです。これが基本的な理由です。 –

+0

完璧!ありがとう.. – abc

+0

@Umut Tabak:私はあなたが正しいことを確信していませんが、はい、それが理由です。しかし、OPが 'point.cc'に対して生成されたオブジェクトファイルを追加しない場合、リンクプロセスは成功するはずです。この場合、' Point :: Point() 'の定義が1つしか見つからないからです。これはまだまだ本当におかしなことです。 – ereOn

2

もう1つの原因はビルドコマンドです。同じ.cppファイルが2回リストされている場合は、間違いなくこのエラーが発生し、作成していない関数でもエラーが発生すると言います。

将来的に誰かを助けるかもしれません。

関連する問題