2013-06-05 30 views
12

何を検索するのかわからないので、これについての説明を探しています。
私はエラーを報告し、このコードを持っている:C++で「タイプにエラーが発生しました」というエラーが発生しました

struct Settings{ 
    int width; 
    int height; 
} settings; 

settings.width = 800; // 'settings' does not name a type error 
settings.height = 600; // 'settings' does not name a type error 

int main(){ 
    cout << settings.width << " " << settings.height << endl; 

を私がメインで値の割り当てを置けば、それは動作します:

struct Settings{ 
    int width; 
    int height; 
} settings; 

main() { 
    settings.width = 800; // no error 
    settings.height = 600; // no error 

あなたはなぜ私を説明できますか?

EDIT:
ラルフTandetzkyの答えをに関しては、ここでは私の完全な構造体のコードがあります。スニペット構造体のように値を割り当てる方法を教えてください。

struct Settings{ 
    struct Dimensions{ 
     int width; 
     int height; 
    } screen; 

    struct Build_menu:Dimensions{ 
     int border_width; 
    } build_menu; 
} settings; 

答えて

24

割り当てをC++の関数のコンテキスト外に置くことはできません。 =記号は、同様初期のために使用することができるためだ

int x = 42; // <== THIS IS NOT AN ASSIGNMENT! 

int main() 
{ 
    // ... 
} 

:あなたは時々=シンボルを見たという事実によって当惑している場合など、関数のコンテキスト外で使用されています。あなたの例では、データメンバーwidthheightを初期化していないので、値を割り当てています。 C++ 11では

+0

そんな微妙な問題です。気づいたことがなかった+ 1。ここで欠けているのは、通常の標準参照です。あなたやアンドリー、またはアンドリーのアカウントにハッキングした他の人ですか?:-) –

+1

ああ、すごいです。私も初期化を使用しているので、なぜこの構造体の前にいくつかの変数があるので、これがうまくいかなかったことを理解できませんでした。 したがって、明確にする。 'int i = 5;'はうまくいきますが、 'int i;'の後ろに 'i = 5;'が続くことはありませんか? – Qwerty

+1

@Qwerty:まったく –

8

あなたのバグを修正するために

struct Settings { 
    int width; 
    int height; 
} settings = { 800, 600 }; 

を書くことができます。関数本体の外側に値を代入しようとしているため、エラーが表示されます。ファンクション外でグローバルデータを初期化できますが、割り当てはできません。

EDIT:あなたの編集に関する

、ちょうどこれがために相続の、しかし働く場合、私は、100%わからないんだけど

Settings settings = {{800, 600}, {10, 20, 3}}; 

を書きます。この場合、継承を避け、会員データとしてDimensionsBuild_menu構造体に書き込むことをお勧めします。この方法で継承すると、遅かれ早かれあなたにあらゆる種類の問題が生じます。 Prefer composition to inheritance.そうすると、それは見た目になります

Settings settings = {{800, 600}, {{10, 20}, 3}}; 
+0

もこれを書くことができます 'struct Settings { int width = 10; int height = 20; }設定; ' –

+0

ありがとう、これについては、別の質問があります。私が投稿した構造体は、実際の構造体のスニペットに過ぎませんでした。私は私の質問を更新します、あなたはとても親切で、このassignmenetを使ってどうすればいいのでしょうか?私は私のmain.cppの開始時に構造体を定義しています(もちろん含む)ので、これは私のコードで最初に見られるものです。だから私は、300行目のmain()ではなく、そのようなバリュー・アドメントセットを好む理由です。 – Qwerty

+0

@Qwertyこれは単なる初期化です。これらのメンバーの状態を知るために構造体を初期値に設定します。その後、あなたはプログラムでそれを変更することができます。\ –

関連する問題