0

main()フォーム内の構造体を指定 ( の前または後に宣言)

struct
{
    ...
} bar;

これを管理する方法と、この種のオブジェクトを処理する方法がわかりません。

一般的に、これについて 360° の回答を希望しますが、いくつか質問があります。

  • staticこれはstructを宣言するのと同じですか?
  • C++11 では合法で安全ですか?
  • 参照によってバーにアクセスする方法は?

最後の 1 つについては、ここに小さなスニペットを用意しました。これは機能しませんが、私が達成しようとしていることを示しています。

4

5 に答える 5

3

名前のない構造体のグローバル オブジェクトです。この型を関数の引数として使用することはできません (オブジェクトの実際の型がわからないため)。これには decltype を使用できますが、グローバル オブジェクトであるため必要ありません。合法で安全です。

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo(decltype(bar)& a)
{
    return a.k1-1;
};

int main()
{
    std::cout << foo(bar) << std::endl;
    return(0);
}

実際、この構造体のグローバル オブジェクトは 1 つしかないため、単純に使用できます。

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo()
{
    return bar.k1-1;
};

int main()
{
    std::cout << foo() << std::endl;
    return(0);
}
于 2013-05-17T05:52:43.447 に答える
0

これは単なるグローバル変数です。このコンパイル単位の任意の関数またはメソッドからアクセスできます。(スニペットに関して)それを宣言する正しい方法は次のとおりです。

struct foo
{
    double k = 1.23;
};

foo bar;

これで、次のように参照渡しで簡単に渡すことができます。

void f(foo & b)
{
    b.k = 34.5;
}

あなたのスニペットでは、 bar は名前のない構造体である型の変数です:

struct <unnamed>
{
    double k = 1.23;
} bar;

型に名前を付けていないため、従来の方法で関数にパラメーターとして渡すことはできません。C++11 では、decltype ディレクティブを使用してこれを行うことができます。

struct
{
    double k = 1.23;
} bar;

void f(decltype(bar) & b)
{
    b.k = 3.45;
}

あなたの質問について:

  • これは、静的構造体と同じではありません。静的変数の動作は少し異なります。静的クラス (= 構造体) も。

  • C++11 でグローバル変数を使用すること合法かつ安全ですが、プログラムのロジックやアーキテクチャを簡単に壊す可能性があるため、使用しないことを強くお勧めします。代わりに、静的クラスまたはシングルトンを使用する必要があります。

于 2013-05-17T05:53:05.517 に答える
0

No. staticはストレージ属性です。Astructは、他のデータ型と同様です。それはstaticvolatileautoexternandその他の実装で定義されたものにすることができます。

合法で安全です。

このような構造を次のように参照します。

struct {
     int   field1, field2;
     double  yada, yada2, yada3;
} bar1, bar2;

bar1.yada3 = 3.14159265358979;   // assign a field in the struct
bar2 = bar1;   // copy contents of bar1 to bar2
于 2013-05-17T05:53:29.670 に答える
0

staticこれはstructを宣言するのと同じですか?

いいえ、static他のstatic変数と同様に、キーワードを使用します。グローバル変数を宣言しています。つまり、静的ストレージ期間と外部リンケージを使用して、次と同等です。

struct Bar {...};
Bar bar;

C++11 では合法で安全ですか?

はい。

参照によってバーにアクセスする方法は?

型には名前がないため、テンプレート引数の推論によって、または C++11 で推論する必要があります。

auto & ref = bar;

template <typename Bar> void bar_by_ref(Bar & bar) { 
    /* do something with bar */ 
}

あるいは、C++11 では、次のようにして型を抽出できますdecltype

decltype(bar) & ref = bar;
于 2013-05-17T08:21:56.870 に答える