5

共用体は、クラスや構造体と同じように型として使用できます (いくつかの制限があります)。メンバー関数を持つことができます。OOP コンストラクトとして使用できます。

私が理解しているように、共用体は C との下位互換性を維持するために C++ にインポートされただけです。
ここ数年のプログラミングで、クラスや構造体を OOP 構造として使用するような共用体を使用したことはありません。

Union を OOP コンストラクト (データ型としてだけでなく) として実際に使用することはありますか?それとも、決して役に立たない言語の一部にすぎませんか?


編集:
標準では、ユニオンがOOPコンストラクトとして機能することを確実に許可しています。ユニオンでメンバー関数を使用できます。次のコードはコンパイルして動作し、標準に準拠しています。

union A
{
    int a;
    int k;

    void doSomething(){}

};

int main()
{
    A obj;
    int i = obj.a;
    obj.doSomething();
    return 0;
}

OOP コンストラクトとして機能することが想定されていない場合、標準でユニオン内のメンバー関数が許可されているのはなぜですか?
具体的な理由を添えて回答を投稿してください。正当な理由がなければ、そうは思わない回答を投稿しないでください

4

6 に答える 6

5

いいえ、共用体は OO 構造ではありません。

OO の最も重要な機能の 1 つはポリモーフィズムですが、共用体は継承関係に参加できず (異なる型のベースになることも、ベース自体を持つこともできません)、仮想関数を持つこともできません。共用体の唯一の目的は、オブジェクトではなく、データ型を提供することです。

于 2012-05-05T16:16:53.963 に答える
1

私の個人的な見解は「いいえ」です。

歴史的に、C は開発者がホスト システムへの低レベル アクセスを許可し、非常に柔軟な方法でメモリにアクセスしていました。メモリの同じ領域を異なるデータ型として扱う構造を提供することで、この柔軟性がさらに容易になりました。

しかし、これがどのようなタイプのオブジェクト指向構造として分類されるかを理解するのは困難です。

于 2012-05-05T15:21:49.357 に答える
1

いいえと思います。

ユニオンはオブジェクト指向とは何の関係もありません。

C++ は、OO のみをサポートするつもりだとは決して言いません。C++ は最初から複数のパラダイムをサポートします(一方で: 手続き型、関数型、生成型、オブジェクト指向)

C++ 11 は「無制限の共用体」をサポートしていますが、OO の観点からは使用法が見当たりません。

作成者によっては、オブジェクト指向には次の問題が必要です。

  • 身元
  • 継承/ジェネラリズム
  • 多形
  • カプセル化

ユニオンの場合、最初の発行が有効です。組合は(たとえば、そのアドレスによって)識別できます

共用体で利用できる継承の概念はありません。

データはユニオン内のポリモーフであると主張することもできますが、この解釈は oo がポリモーフと見なすものとはかけ離れています。共用体は、継承なしではほとんど役に立たない仮想関数を持つことができませんでした。そして、それはメモリレイアウトを壊します。

ユニオンにはカプセル化があります。ただし、制限があるため、この場合の有用なアプリケーションは期待できません。もしあれば、リンクをいただければ幸いです

この一連の機能では、「抽象データ型」(ADA) が適切な用語であると考えています。

于 2012-05-05T15:23:52.333 に答える
1

これは良い習慣ではありませんが、アクティブなフィールドが 1 つだけであることを確実に保証できるとします。

class multi_type {
private:
    bool unit_is_float;
    union {
        float float_member;
        int int_member;
    };
public:
    multi_type(bool is_float) : unit_is_float(is_float) {}
    bool isFloat() { return unit_is_float; }
    bool isInt() { return !unit_is_float; }
    float& getFloat() {
        if (!isFloat()) throw std::logic_error("not a float");
        return float_member;
    }
    int& getInt() {
        if (!isInt()) throw std::logic_error("not an int");
        return int_member;
    }
};

きれいではなく、簡潔になるようにフォーマットされています。

有効なアプリケーションは、解析対象の言語が実行時にのみ決定できるさまざまな種類のトークンを持つことができる、ある種の解析ライブラリにある場合があります。これは void*s を使用する代替手段です。

于 2012-05-05T15:53:05.503 に答える
0

低レベルの構成要素として、コンテキストに基づいてデータの解釈と型が異なる場合、共用体が役立ちます。この意味で、同時に存在できない異なるフィールドを保持する場合よりも、オブジェクトを小さく保つのに役立ちます。

それはOOPにとって有効な懸念ですか?たぶん、たぶん...

--

人々がそれらを使って行うハックの 1 つは、異なる名前で異なるバイトにアクセスすることです (典型的な例は、4 バイト r、g、b、a と 1 つの 32 ビット整数色の結合を持つことです) が、これは潜在的に危険ですhttps://stackoverflow. com/a/1582389/278842

于 2012-05-05T15:25:16.383 に答える