3

注: これは割り当てです。割り当ての一部であるため、ユニオンを使用したソリューションを探しています。使用したいソリューションを提供しますが、この概念とアプローチを大局的に理解するための支援が必要です。---

ユニオンで文字列が機能しないことを認識しており、この質問は以前に尋ねられましたが、すべてブーストの提案を終了しているようです。しかし、誰かが指針を提案しているのを見ましたが、見過ごされているように見えたので、もっと明確にしたいと思いました. 以下に 2 つの構造体を示します。回避策として、両方の構造体へのポインターを含む共用体を使用します。

struct HourlyInfo {
    string firstName;
    string lastName;
    string title;
    int hoursWorked;
    double hourlyRate;
};

struct SalaryInfo {
    string firstName;
    string lastName;
    string title;
    double salary;
    double bonus;
};

union Employee {
    HourlyInfo *hourlyEmployee;
    SalaryInfo *salaryEmployee;
};

この方法に何か問題はありますか?私には、組合の目的に反しているように思えます。

編集:これは課題ですが、非常に自由です。私は答えを探しているのではなく、特定の方法を避けるべき、または避けるべき理由についての説明と意見を求めているだけです。私の代替手段は を使用しcstringていますが、ポインターメソッドを ( の利便性を持たせるためにstring) を使用するだけで比較しようとしていcstringます。

編集 #2: ユニオンは、もう一方が定義されると、一方の構造体を無効にすることを理解しています。これらの労働組合の配列を作成します。従業員は時給または給与のいずれかであるため、この場合の労働組合の使用は保証されます。私の懸念は、回避策として文字列とポインターを使用することです。

4

4 に答える 4

2

これを行う C++ の方法は継承です。

struct EmployeeInfo {
    string firstName;
    string lastName;
    string title;
};

struct HourlyInfo : public EmployeeInfo {
    int hoursWorked;
    double hourlyRate;
};

struct SalaryInfo : public EmployeeInfo {
    double salary;
    double bonus;
};

基本クラスのポインタで削除できるように、仮想デストラクタを指定します。EmployeeInfoそして、共用体の代わりにポインタを格納します。必要に応じてアップキャストします。そして、仮想関数、またはどこかの「従業員タイプ」変数を介して違いを説明します。ユニオンのシナリオでは、とにかくそれが必要になります。ユニオン自体は、その中のどのデータ項目が関連するものかを教えてくれないからです。

はい、 を導出できますstruct。また、メンバー関数も含めることができます。

于 2013-10-26T17:39:42.110 に答える
1

匿名の共用体と構造体を使用することもできます。

struct Employee {
    string firstName;
    string lastName;
    string title;
    bool isHourly;
    union {
        struct {
            double hourlyRate;
            int hoursWorked;
        } hourly;
        struct {
            double salary;
            double bonus;
        } salaried;
    };
};

次にEmployee emp; emp.hourly.hourlyRate = 100; 、構造体名を削除することもできます-その後、それらのフィールドにとしてアクセスできるようになりますemp.salary。あなたのアプローチはまだ大丈夫です - 労働者がサラリーマンか時給かを確認するための情報を保存する場所があると仮定します。もう一方のポインターは null ではなく、同じデータへの同じポインターになりますが、別の型のように扱われるため、未定義の動作が発生する可能性があります。

私自身はまだ戦略パターンのようなものを好むでしょう.

于 2013-10-26T17:47:52.980 に答える
0

ここには何の問題もありません。

ご了承ください:

  • 両方のポインターを使用して異なる値を同時に格納することはできません。
  • 2 つの (構造体) ポインターを共用体にカプセル化しても、あまり節約できません。
于 2013-10-26T17:27:30.890 に答える
0

申し訳ありませんが、それらがポインターであることに気づきませんでした。はい、それは完全に無意味です。また、HourlyInfo を割り当てて SalaryInfo::bonus メンバーにアクセスすると、クラッシュが発生します。1 つの構造体が (おそらく) 他の構造体よりも大きいためです。(int = 32 ビット、double = 64 ビットの場合)

于 2013-10-26T17:25:26.973 に答える