2012-03-31 6 views
1

構造体メンバを関数に渡す際にかなりの量の読み込みを行ってきました。しかし、誰かが私が間違っている場所を明確にすることができれば、私はそれを感謝するでしょう。私はこれが何よりもコンパイル順序/定義エラーであると予測しますが、構文エラーもあります。参照による構造体値の変更(潜在的にコンパイル順序の問題)

私が理解しているように、私は構造体のメンバーデータを変更でき、参照(この場合はポインタではありません)として渡すことでコピーを避けることができます。このメソッドは、関数内の個々のメンバーにアクセスするためのドット表記を保持することもできます。

MAIN.CPP:

// include headers 
struct foo{ 
    int a; 
    int b; 
}foo_data; 

int main(){ 
    foo_data.a = 1; // assign some values to the member in standard format. 
    foo_data.b = 2; 

    function(foo_data); 
    // should this be &foo_data, am I passing by value here as it is 
    // or is the declaration taking care of that? 
} 

functions.h:

void function(foo &) // function declaration reference of type foo 

functions.cpp:

void function(foo &foo_data) // function definition reference of type foo 
{ 
    foo_data.a; // should == 1 
    foo_data.b; // should == 2 
} 

誤差は、典型的にはfoo_dataされ、宣言されていない識別子に関連します。私は関数の宣言を伝える必要がありますか?私は構造体、または実際にint(参照?)を渡しています

ありがとう!

答えて

1

根本原因:
あなたがエラーを取得し、コンパイラががわからないので、/あなたのcppファイルで使用タイプfooを理解しています。それはの定義を見る場合にだけタイプを知ることができます。

ソリューション:
あなたはヘッダファイルに構造体の宣言を入れて、あなたが関数を宣言ヘッダーと、あなたがそれを定義するCPPファイルの両方でそのヘッダーファイルをインクルードする必要があります。

functions.h

struct foo{ 
int a; 
int b; 
}; 
extern foo foo_data; 
void function(foo &); 

functions.cpp

#include "functions.h" 
foo foo_data; 


void function(foo &foo_data) function definition reference of type foo 
{ 
    //access local foo_data 
    foo_data.a // should = 1 
    foo_data.b // should = 2 

    //access global foo_data 
    ::foo_data.a = 1; 
    ::foo_data.b = 1; 
} 

MAIN.CPP

#include "functions.h" 

int main() 
{ 
    //Global foo_data is accessible here now 
    foo_data.a = 
    foo_data.a = 
    .... 
} 

EDIT:
あなたのご意見をおexternを使用する必要があり、その場合には、複数のソースファイル間でfoo_dataインスタンスを共有したいお勧めは、私は、そうするために上記のコードサンプルを変更しfunction()内のローカルfoo_dataインスタンスが非表示になりますのでご注意しますグローバルインスタンスを使用する場合は、グローバルオブジェクトを使用する場合は、::foo_dataとして使用する必要があります。

+0

こんにちは、これは実際には設計上の問題でした。構造体を.hファイルに移動し、並べ替えを行うとコンパイルできます。 main.objに既に存在する構造体に関連するリンクエラーが発生しました - 検索後、これは複数の.cppファイルが同じインスタンスを使用できないことに関連しています。私の.hで "static struct"を割り当てることはできますが、この構造体をグローバルにすることはできますか? "extern"は同様のエラーを引き起こし、これはベストプラクティスですか?ありがとう! –

+0

@ChrisJones:同じグローバルオブジェクトを別のファイルで共有する必要がある場合は、 'extern'を使用する必要があります。グローバルを使用している場所は表示されません。 –

+0

こんにちは、私のヘッダーファイルがmain.cppに含まれている場合、OR functions.cppはコンパイルしてリンクします。両方のファイルに含まれている場合は、次のリンクエラーが表示されます。functions.obj:エラーLNK2005:main.objで既に定義されている "struct Foo foo_data"(?foo_data @@ 3UFoo @@ A) hはプリコンパイル済みの直後です。 –

1

fooのクラス定義は、mainfunctionの両方に表示する必要があります。このようにそれを実行してください:あなたのfunctionだけに必要がある場合

// File foo.hpp 

struct foo { int a; int b; }; 
void function(foo &); 

// File main.cpp 

#include "foo.hpp" 

int main() 
{ 
    foo foo_data; 
    foo_data.a = 1; 
    function(foo_data); 
} 

// File foo.cpp 

#include "foo.hpp" 

void function(foo & x) 
{ 
    // use x.a, x.b etc. 
} 

値を読み取るあなたはfoo const &引数でそれを宣言することができます。

関連する問題