2012-02-16 11 views
1

main.cppからRawクラスの別の関数foo()を呼び出そうとしていますが、このエラーが発生し続けています。コード。私はC++で作業しており、QTフレームワークを使用しています。私はこの言語とフレームワークが初めてです。別のクラスを呼び出せません - ERR - 未解決の外部シンボル

エラー: LNK2019:function_mainで参照される未解決の外部シンボル「public:void __thiscall RAW :: foo(void)」(?foo @ Raw @@ QAEXXZ)。ファイルが見つかりません:MAIN.OBJ raw.cppで

main.cppに

#include "raw.h" 

using namespace std; 


int main(int, char*) 
{ 
    Raw newRaw; 
    newRaw.foo(); 

    return 0; 
} 

raw.cpp

#include "raw.h" 
#include <iostream> 

using namespace std; 

void foo() 
{ 
    cout << "hi\n"; 
} 

Raw::Raw() 
{ 
    cout << "raw\n"; 
} 

raw.h

#ifndef RAW_H 
#define RAW_H 

class Raw 
{ 
public: 
    Raw(); 
    void foo(); 
}; 

#endif // RAW_H 

答えて

4

あなたはFOOを定義する必要がありますこのように:

void Raw::foo() 
{ 
    cout << "hi\n"; 
} 

Raw ::を置く必要があります。これは、コンパイラーがこれがクラスメンバー関数fooであり、他の独立した関数ではないことを認識できるようにするためです。

+0

Raw ::を置くことに代わる方法はありますか?たとえば、raw.hでできることはありますか? – Jon

+0

関数を以下のように定義することができます:void foo(){cout << "hi¥n";}より複雑な関数の場合は良い習慣とはみなされません。 – Mihai

+0

raw.hにfoo()を定義していませんか?私は8行目の "void foo();"に行きました。 – Jon

3

Mihaiが言っていたように、ヘッダーファイル(.h/.hpp)で定義することもできますが、クラスメソッドが複雑な場合は悪い習慣とみなされます。

class Raw { 
public: 
    void foo() { 
     cout << "hi\n"; 
    } 
}; 

本当にこれを行う必要があるのは、きわめて単純なクラスであり、実際にはゲッター以上の方法ではありません。

C++での定義と宣言の違いを理解する必要があります。

単純にプロトタイプを作成することを宣言します。たとえば、doSomethingメソッドがvoidを返してvoidを返すと、void doSomething(int);は有効な宣言です。

ここでは、その機能について説明する必要があります。 void doSomething(int val) { cout << val << endl; }を実行したときの定義です。その機能で何をすべきかを説明しています。

私が示したように、またはMihaiが示したソースファイル(.c/.cpp)に定義することができます(これはベストプラクティスです)。ただし、ヘッダーファイルでのみ宣言を行うことができます。

+0

説明ありがとうございました。それは今私にとって理にかなっています:) – Jon

2

[OK]を、これはいくつかの選択肢です。どちらの場合も

//raw.h 

#ifndef RAW_H 
#define RAW_H 

class Raw 
{ 
public: 
    Raw(); 
    void foo(){cout << "raw\n";} 
}; 

または

//raw.h 

#ifndef RAW_H 
#define RAW_H 

class Raw 
{ 
public: 
    Raw(); 
    void foo(); 
}; 

Raw::Raw() 
{ 
    cout << "raw\n"; 
} 

あなたはもうraw.cppでの実装を必要としません。しかし私が前に言ったように、私の最初の解決策は標準的なC++の練習です。

+0

元のポスターに関しては、あなたの定義をソースに入れておくことを強くお勧めします。 – crush

+0

Mihaiさんのお手伝いをありがとうございます。私はC++をもっと理解し始めていると思う – Jon

関連する問題