字符串、联合和指针

Strings, Unions, and Pointers

本文关键字:指针 字符串      更新时间:2023-10-16

注意:这是一个作业。我正在寻找使用工会的解决方案,因为这是任务的一部分。我提供了我想要使用的解决方案,但我需要帮助来正确看待这个概念和方法。---

我知道字符串在工会中不起作用,这个问题之前已经问过 - 但它们似乎都以 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;
};

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

编辑:这是一项作业,但它非常开放。我不是在寻找答案,只是解释和输入为什么某种方法可能或应该避免。我的替代方案是使用 cstring ,但我正在尝试权衡指针方法(为了方便string)与仅使用 cstring .

编辑#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的。您也可以在其中使用成员函数。

您也可以使用匿名联合和结构:

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,它将是指向相同数据的同一指针 - 但被视为另一种类型,因此可能会导致未定义的行为。

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

抱歉没有看到它们是指针,是的,这完全没有意义。此外,在分配每小时信息和访问薪水信息::奖金会员时,您会遇到崩溃。由于一个结构(可能)比另一个结构大。(如果 int = 32 位,双精度 = 64 位)

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

请注意:

  • 您将无法同时使用这两个指针来存储不同的值。
  • 通过将两个(结构)指针封装在一个联合中,您不会节省太多。