未命名的struct和union中的字段变量

时间:2014-09-08 14:37:16

标签: c++ struct unions

在C ++中的union内部的struct中有一些字段是什么意思?我是从YouTube上的“数学游戏开发者”视频系列的一段代码中找到的:

private:
    union {
        struct {
            float m_x,m_Y;
        };
    };

1 个答案:

答案 0 :(得分:1)

我已经检查了2d964cbb9e5065ec327ef6e2a5f086820ed024c1的修订版grepunion,并且我找到的代码示例中最接近的匹配位于math/vector.h following line 56

切入有问题的构造,我们基本上有这个。 (请注意,这与您显示的代码不同。)

struct vec3
{
  union
  {
    struct
    {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

这将允许我们按名称引用vec3的元素,如

std::ostream&
operator<<(std::ostream& os, const vec3& v3)
{
  os << "(" << v3.x << ", " << v3.y << ", " << v3.z << ")";
  return os;
}

或使用

中的数组语法
std::ostream&
operator<<(std::ostream& os, const vec3& v3)
{
  os << "(";
  for (std::size_t i = 0; i < 3; ++i)
    os << (i ? ", " : "") << v3.v[i];
  os << ")";
  return os;
}

虽然这与你在C中的表现一样好,但就个人而言,我认为这是一种糟糕的C ++风格。更现代的清洁和同样有效的方法将使用内联访问器函数和重载operator[]

#include <cstddef>
#include <stdexcept>

#ifndef NDEBUG
#  define DEBUG 1
#else
#  define DEBUG 0
#endif

class vec3
{
private:
  float data_[3];

public:

  constexpr vec3() noexcept : data_ {0.0f, 0.0f, 0.0f}
  {
  }

  constexpr vec3(const float x, const float y, const float z) noexcept : data_ {x, y, z}
  {
  }

  const float& x() const noexcept { return this->data_[0]; }
  const float& y() const noexcept { return this->data_[1]; }
  const float& z() const noexcept { return this->data_[2]; }

  float& x() noexcept { return this->data_[0]; }
  float& y() noexcept { return this->data_[1]; }
  float& z() noexcept { return this->data_[2]; }

  const float&
  operator[](const std::size_t i) const noexcept(!DEBUG)
  {
    if (DEBUG && i >= 3)
      throw std::invalid_argument {"vector index out of range"};
    return this->data_[i];
  }

  float&
  operator[](const std::size_t i) noexcept(!DEBUG)
  {
    if (DEBUG && i >= 3)
      throw std::invalid_argument {"vector index out of range"};
    return this->data_[i];
  }
};

虽然这可能有点多余,但它会给我们一个非常干净和有效的界面带来回报。

使用显式成员访问权限:

std::ostream&
operator<<(std::ostream& os, const vec3& v3)
{
  os << "(" << v3.x() << ", " << v3.y() << ", " << v3.z() << ")";
  return os;
}

使用数组语法(可选择范围检查):

std::ostream&
operator<<(std::ostream& os, const vec3& v3)
{
  os << "(";
  for (std::size_t i = 0; i < 3; ++i)
    os << (i ? ", " : "") << v3[i];
  os << ")";
  return os;
}