3

file_utils.hとfile_utils.cppという2つのファイルがあり、これらには異なるクラスで使用されるいくつかのメソッドと変数が含まれています。外観の例を次に示します。

file_utils.h:

namespace my_namespace
{
extern Foo* foo;
extern Bar* bar;

void my_function(Blah* blah);
}

file_utils.cpp

#include "file_utils.h"

void my_namespace::my_function(Blah* blah)
{
    foo = 0;    // undefined reference to my_namespace::foo
    bar = 0;    // undefined reference to my_namespace::bar
    //...
}

some_class.cpp

#include "file_utils.h"

some_function()
{
    my_namespace::my_function(blah);
    this->foo = *my_namespace::foo; // will that work ok?
}

したがって、エラーはコメントにあります。externキーワードを削除すると、multiple definition of my_namespace::fooエラーが発生します。何が問題ですか?それは設計の観点からも良い考えですか、それとも代わりに静的メンバーとメソッドを持つクラスを使用する必要がありますか?

4

2 に答える 2

7

問題は、変数を宣言しただけで、定義していないことです。

単一の実装ファイルで定義を提供する必要があります。

file_utils.cpp

#include "file_utils.h"

//definition:
namespace my_namespace
{
   Foo* foo;
   Bar* bar;
}

//alternatively, to keep the same formatting you have
//Foo* my_namespace::foo;
//Bar* my_namespace::bar;

void my_namespace::my_function(Blah* blah)
{
    foo = 0;
    bar = 0;
    //...
}
于 2012-06-20T15:32:25.417 に答える
0

まず、 2つの違いを明確にすることを勧めします。

  • 宣言と定義
  • コンパイラとリンカ

あなたの場合、リンカーエラーが発生します。未定義の参照とは、コードがどこかを指しているが、リンカーがどこを指しているのかを理解できないことを意味します。

externキーワードは、コードのどこかにあるオブジェクトを使用するときに、コンパイラエラーを抑制するために使用されます。この例では、リンカはクラスのインスタンスを見つけようとしますが、失敗します。これは一般的にポインタでは使用されません(間違っている場合は修正してください)。したがって:

utils.h

namespace mySpace{
    extern Foo foo; // notes that foo of type Foo will be used.

    void myFn();
}

utils.cpp

#include "utils.h"

void mySpace::myFn(){
    foo.bar = 5; // changes a member of foo from globals.cpp
}

globals.cpp

Foo mySpace::foo; // this is the actual foo used.

some_class.cppに関する質問への回答が必要な場合は、コミュニティに何conversionsを達成したいのかについての知識を提供してください。

セマンティクスから判断すると、クラスのメンバーへの参照であると思いますconversions

于 2012-06-20T15:50:51.627 に答える