【问题标题】:Storing elements with different types into an array将不同类型的元素存储到数组中
【发布时间】:2017-09-04 13:08:32
【问题描述】:

如何在数组中存储不同类型的元素?
下面的示例可能会导致问题,因为“轮子”可以在 8 位数组中使用 32 位,因此它会填充前 4 个字段(如果我理解正确的话)。我可以使用移位运算符

class Car
{
    public:
        Car();
        ~Car();

    private:
        int32 wheels;             // 32 bit Integer
        bool canDrive;            // 1 bit Boolean
        int16 doors;              // 16 bit Integer
}

Car()
{
    wheels = 4;
    canDrive = true;
    doors = 2;
}

int main()
{
    Car testCar;
    int08 tmpArray[ARRAY_SIZE] = { 0 };   //8-bit Integer array

    tmpArray[0] = testCar.wheels;         //Store 32-bit Integer into 8-bit Integer
    tmpArray[1] = testCar.canDrive;       //Store 1-bit Boolean into 8-bit Integer
    tmpArray[2] = testCar.doors;          //Store 16-bit Integer into 8-bit Integer

    /* Do something with tmpArray */       

    return 0;
}

【问题讨论】:

  • 它不会“在 8 位中使用 32 位”任何东西。该值将被转换,可能会丢失数据。
  • 你想在整数数组中插入一辆车吗?
  • C 和 C++ 数组只能保存相同类型的元素。如果您只需要获取表示testCar 结构的字节(例如以二进制形式将其转储到磁盘上),您可以使用int08 const * p_test_car_bytes = reinterpret_cast< int08 const * >(::std::addressof(testCar));
  • 如果您认为可以将轮子存储在int08 类型中,只需将轮子声明更改为int08
  • 你想把Car序列化成std::vector<std::uint8_t>吗?

标签: c++ arrays types


【解决方案1】:

我不明白你的代码 - 你只是想要一个 Car 的数组吗?

如何在数组中存储不同类型的元素?

使用std::variantboost::variant。例如,假设您想要一个 intfloat 的数组:

using i_or_f = std::variant<int, float>;
std::array<i_or_f, 5> arr;
arr[0] = i_or_f{5};
arr[1] = i_or_f{0.4f};

【讨论】:

    【解决方案2】:

    1.) 您的 testCar 构造不正确。没有数据分配给wheelsm,canDrive,...。因此,使用此未定义数据设置其他值将导致未定义行为。

    2.) 您的 car 类的成员值是私有的(这是一件好事,因为它确保了您的数据封装)。您将无法随意访问它们。

    3.) 您可以从您的不同类型进行类型转换。但是你为什么要这样做。你失去了type safety

    4.) 您能否解释一下,将您的班级成员存储在数组中的目的是什么。如果您不想担心实际类型,请考虑使用auto

    This也值得一读。

    【讨论】:

      【解决方案3】:

      如何在数组中存储不同类型的元素?

      使用多态性。

      创建一个基类指针的 std::vector。

      std::vector<Car_t*> carVec;
      

      创建指向派生实例的指针并安装在向量中。每个派生实例都是不同的类型。

      carVec.push_back(new Derived_A_FromCar);
      carVec.push_back(new Derived_B_FromCar);
      carVec.push_back(new Ferrai_t);
      carVec.push_back(new Fairlane_t);
      ... etc
      

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 2014-09-25
        • 2017-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多