2016-06-18 11 views
0

ヘッダー、実装、およびメインファイルで構造体とコンストラクタがどのように機能するかを調べようとしています。コンストラクタとデフォルトコンストラクタの使用。私が持っているNumbers.cppで構造体にコンストラクタを定義しています

#ifndef H_TEST 
#define H_TEST 

struct numbers{ 

    int a; 
    int b; 
numbers(); 

numbers(int x, int y); 

}; 
#endif 

::私は '番号::番号()' 私が持っているTEST.Hで

に「未定義の参照のmains.cppでコンパイル・エラーが発生します

#include "test.h" 

numbers::numbers() 
    { 
    a=0; 
    b=0; 
    } 
    numbers::numbers(int x, int y) 
    { 
     a=x; 
     b=y; 
    } 
mains.cppで

私が持っている:あなたはFに入れて、ヘッダー・ファイル内のインラインコンストラクタを宣言しているよう

#include<iostream> 
#include "test.h" 
using namespace std; 

numbers num;//compilation error occurs here 
int main() 

{ 





return 0; 
} 
+2

ほとんどの理由は、あなたが正しくリンクしていないということです。あなたは 'mains.cpp'だけをリンクしています。 –

+1

[定義されていない参照/未解決の外部シンボルのエラーとは何ですか?それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボルエラーとその対応方法) – incBrain

+0

MSVS 2013で正常に動作しています。どれを使用しましたか? –

答えて

3

が見えます(たとえ空の関数本体でも)コンストラクタのための関数本体です。

私は、コンパイラがインライン定義を見ているときにヘッダを含むファイルでそれらを使用するので、.cppファイルの定義にリンクされるシンボルを決して生成しないことを期待します。 cppファイルは呼び出されません。

ヘッダー内の空の関数本体を削除してみてください。

+0

{}を追加しない限りコンパイルできません。ヘッダーファイルに追加します。 – Alex

+2

@Janeそれでは別の問題です。関数本体を別の場所に定義したい場合は、ヘッダーの空の関数本体が間違っているため、エラーを投稿する必要があります。 –

3

問題は、デフォルトでnumを構築していて、再割り当てしていないということです。

numbers num; // num is default-constructed to a = 0, b = 0, as before. 
int main() 
{ 
    num = numbers(3,5); // num now holds a = 3, b = 5. 

    cout<<num.a; // Prints 3, as expected. 

    return 0; 
} 

サイドノート:

numbers num; // Constructs a numbers object with a = 0, b = 0 and stores it in num. 
int main() 
{ 
    numbers(3,5); // Constructs a numbers object with a = 3, b = 5. 
        // The object is discarded after the constructor call finishes. 

    cout<<num.a; // Prints a from the global variable num. 

    return 0; 
} 

私はあなたがNUMを再割り当てするためのものだと思いますが、一般的に非constグローバル変数を避ける必要があります。また、可能であれば、宣言した同じ行の変数を初期化して、データメンバーを2回割り当てないようにします(このような非常に小さなオブジェクトでは問題ありません)。

編集:私はQuantumMechanicが指摘した問題に気づいていませんでした。プログラムが期待どおりに動作するためには、両方のエラーを修正する必要があります。

+0

ええ、mains.cppのnumbers :: numbers()とnumbers(int、int)の未定義参照のコンパイルエラーが発生しました – Alex

+0

Code :: Blocksを使用しているとお伝えしました。 Numbers.cppをプロジェクトに追加しましたか? (おそらくソースの下に表示されるはずです) –

+0

はい、私のプロジェクトのソースファイルでした。私はそれを最終的にコンパイルすることができました。私はなぜそれが前にないか分からない! – Alex

関連する問題