2012-02-29 6 views
0

各ファイルに#include "stdafx.hが省いてあります。LNK2005を入手すると、私はこれを修正するために何ができるのかわかりません

struct stuff 
{ 
    float f; 
    thing * t; 
}; 
b.h

STDAFX.H(プリコンパイル済みヘッダー)

#include a.h 
#include b.h 
class stuff; 
stuff * s 

a.h

class thing{float f; void fun()}; 

a.cc

void thing::fun(){} 
thing::thing(): 
    f(b->f) {} // lnk 2005 linking error 

あなたが見ることができるように、私はstdafx.hを

に事前宣言されsにアクセスしようと、私は私ので、この設計を

b.cc

stuff::stuff(): f(3.4) { t = new thing; } 

main.cc

int main() 
{ 
    s = new stuff; 
    s -> fun(); 
} 

をやっていますシングルトンに頼る必要はありません(他の小さなオブジェクトでアクセスしたいメインクラスが1つあります)

何らかの方法でexternキーワードを使用する必要がありますか?プリコンパイル済みヘッダーに問題がありますか?

+0

確かにあなたが '#include" ah "'を意味する – Bart

+0

クリップボードを使ってコードを質問にコピーしてください。少なくとも1つの構文エラーがあります。エラーの原因であることを示す行が間違っています(私はそれが 'f(s-> f){}'でなければならないと信じています)。このようなタイプミスは、問題が本当に何であるかを知ることが難しくなる可能性があります。 –

+0

それは正確なコードではなく、私のコードプロジェクトははるかに大きいです、私はちょうど私の問題を記述するための例としてこのコードを使用しました。私のプロジェクトのコードをすべて貼り付ける余地はありません。 – jokoon

答えて

0

は、コードを再設計して解決しました。 C++はそれほどクリーンではありません。

1

stdafx.hでは、sを宣言しましたが、定義したことはありません。私は希望:

  1. は次のようにmain.cc中のSの定義を追加STDAFX.H中で宣言に
  2. externを追加します。

    もの* S = NULL;

+1

マイナー詳細:あなたは「あなたが決して定義したことはありません」と言います - それは間違っています。 * *は定義されていますが、ヘッダーには各翻訳単位で定義されています。それが問題です。修正するための手順は正しいです。 –

+0

@Michael Burr:はい、私は間違っています。 stdafx.hに 'extern'があった場合、私のステートメントは正しいでしょう。 –

0

グローバル変数を削除することをお勧めします。どのタスクでも読み書きができるので危険です。マルチスレッドおよびマルチタスクシステムでは、グローバル変数へのアクセスを制御することが必要かつ複雑になります。

私の現在のプロジェクトでは、グローバル変数が存在しないことを要求しました。 getterとsetterには静的なローカル変数があります。ゲッタとセッタを使うと、パターンを滑らせてマルチタスクの問題を防ぐことができます。

グローバル変数を削除することをお勧めします。あなたはすでに彼らに対して1つの問題を発見しました。

関連する問題