C++には匿名クラスと呼ばれる機能があります。これはCのanonymousstructと似ています。この機能はいくつかのニーズのために発明されたと思いますが、それが何であるかを理解することはできません。
本当に匿名のクラスが必要な例をいくつか教えてもらえますか?
C++には匿名クラスと呼ばれる機能があります。これはCのanonymousstructと似ています。この機能はいくつかのニーズのために発明されたと思いますが、それが何であるかを理解することはできません。
本当に匿名のクラスが必要な例をいくつか教えてもらえますか?
この機能は、同じものであるためstruct
に存在します。一方で実行できることはすべて、もう一方でも実行できます。これは、Cclass
の匿名とまったく同じ目的を果たします。struct
いくつかのものをグループ化し、その1つ以上のインスタンスを宣言したいが、そのタイプを名前で参照する必要がない場合。
これは、C ++であまり一般的に使用されていません。これは、C ++の設計がより型指向である傾向があり、匿名クラスのコンストラクタまたはデストラクタを宣言できないためです。
厳密な意味では本当に必要ではなく、決して必要ではありませんでした。つまり、たとえばanonymous1
、いつでも名前を割り当てることができますanonymous2
。しかし、必要以上に多くの名前を追跡することは、常に面倒です。
役立つのは、グループに名前を付けずにデータをグループ化したい場所です。私はいくつかの例を思い付くことができます:
class foo {
class {
public:
void validate( int x ) { m_x = x; }
bool valid() { return m_exists; }
private:
int m_x;
bool m_exists;
} maybe_x;
};
この場合、int
とはbool
論理的に一緒に属しているため、それらをグループ化することは理にかなっています。ただし、この具体的な例では、実際のオプションタイプを作成するか、使用可能なタイプの1つを使用するのがおそらく理にかなっています。これは、このパターンが他の場所でも使用される可能性が高いためです。その他の場合、このグループ化のパターンは非常に特殊であるため、そのクラスにのみとどまる価値があります。
ただし、匿名クラスはめったに使用されないと思います(おそらく、ライブで2、3回しか使用していません)。多くの場合、データをグループ化したい場合、これはクラスやスコープに固有ではなく、他の場所でも意味のあるグループ化です。
次のような入れ子関数を作成すると役立つ場合があります。
void foo() {
class {
void operator()(){
}
} bar;
bar();
}
しかし、今ではラムダがあり、匿名クラスは互換性の理由でのみ残されています。
匿名クラスの使用は、既存のCコードとの互換性を維持するためです。例:
一部のCコードでは、匿名構造と組み合わせたtypedefの使用が一般的です。
Qt5のSignal/SlotシステムでANYクラスを使用し、QObject派生要件なしで使用できる匿名構造体の例があります。
void WorkspaceWidget::wwShowEvent()
{
//Show event: query a reload of the saved state and geometry
gcmessage("wwShowEvent "+ this->title());
struct{void* t; void operator()(){ static_cast<WorkspaceWidget*>(t)->wwReloadWindowState(); }}f;
f.t=this;
QObject::connect( &reloadStateTimer, &QTimer::timeout, f);
reloadStateTimer.start();
}
void WorkspaceWidget::wwReloadWindowState()
{
gcmessage( dynamic_cast<QObject*>(this)->metaObject()->className());
}
基本的に、タイマー信号をQObject以外の派生クラスに接続する必要がありますが、mt"this"を適切に渡したいと思います。
QObject ::connectはQt5の通常の関数に接続できるため、この匿名クラスは実際には、このポインター自体を保持し、スロット接続を通過させるファンクターです。
また、匿名で自動で物事を行うことができます(vs2015)
struct {
auto* operator->() {return this;}
//do other functions
} mystruct;