web-dev-qa-db-ja.com

C ++で匿名クラスを使用することは可能ですか?

私は見た匿名クラス in C++Quoraのコード。正常にコンパイルされ、実行されます。

ここのコード:

#include <iostream>

auto func()
{
    class // no name
    {
      public:
             int val;
    } a;

    a.val = 5;

    return a;
}

int main()
{
    std::cout << func().val << std::endl;
    return 0;
}

したがって、C++で有効ですか?

また、知りたいのですが、C++で匿名クラスを使用することは可能ですか?

24
msc

C++では、anonymous unionは次の形式の和集合です。

 union { ... } ;

これは、名前のないタイプの名前のないオブジェクトを定義します。そのメンバーは周囲のスコープに挿入されるため、他の方法で必要になる<object>.プレフィックスを使用せずにそれらを参照できます。

この意味で、匿名クラス(C++では共用体ではない---共用体はクラスです)は存在しません。

一方、名前のないクラス(構造体や共用体を含む)は珍しいことではありません。

union { ... } x;
class { ... } y;
typedef struct { ... } z;

xyは、名前のないタイプの名前付きオブジェクトです。 zは、名前のない構造体のエイリアスであるtypedef-nameです。この用語は上記の形式の和集合のために予約されているため、匿名とは呼ばれません。

[](){}

ラムダは名前のないクラスタイプの名前のないオブジェクトですが、匿名とも呼ばれません。

19

それだけでなく、decltypeを使用して、クラスのインスタンスをさらに作成できます。

#include <iostream>

class 
{
   public:
      int val;
} a;


int main()
{
   decltype(a) b;
   a.val = 10;
   b.val = 20;

   std::cout << a.val << std::endl;
   std::cout << b.val << std::endl;
   return 0;
}

出力:

10
20
32
R Sahu

次のようなものを書くことは常に可能でした:

typedef struct { int a; } type;

さて、struct { int a }の部分を見ると、これは匿名の構造体です。 C++では、基本的に構造体とクラスの間に違いはありません(デフォルトのアクセス修飾子を除く)。したがって、匿名の構造体/クラスを持つことが可能です。

10
nakiya