3

注意:这是一个任务。我正在寻找使用联合的解决方案,因为它是任务的一部分。我提供了我想使用的解决方案,但我需要帮助来理解这个概念和方法。---

我知道字符串在工会中是如何不起作用的,并且这个问题之前已经被问过 - 但他们似乎都结束了建议 Boost. 但是,我看到有人提出建议,但似乎被忽略了,我想对此进行更多说明。下面我有两个结构,一个包含指向这两个结构的指针的联合作为一种解决方法:

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;
};

这种方法有什么问题吗?对我来说,这似乎违背了工会的目的。

编辑:这是一个任务,但它是非常开放的。我不是在寻找答案,只是对为什么可能或应该避免某种方法的解释和输入。我的替代方法是 using 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's。您也可以在其中包含成员函数。

于 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. 您的方法仍然很好 - 假设您有存储信息的位置来检查工人是受薪还是按小时计酬。另一个指针不会为空,它将是指向相同数据的相同指针 - 但被视为另一种类型,因此可能会导致未定义的行为。

不过,我自己仍然更喜欢策略模式之类的东西。

于 2013-10-26T17:47:52.980 回答
0

抱歉没有看到它们是指针,是的,这完全没有意义。此外,在分配 HourlyInfo 和访问 SalaryInfo::bonus 成员时,您会遇到崩溃。因为一个结构(可能)比另一个大。(如果 int = 32 位和 double = 64 位)

于 2013-10-26T17:25:26.973 回答
0

我在这里没有看到任何问题。

注意:

  • 您将无法同时使用两个指针来存储不同的值。
  • 通过将两个(结构)指针封装在一个联合中,您并没有节省太多。
于 2013-10-26T17:27:30.890 回答