在C ++中的union内部的struct中有一些字段是什么意思?我是从YouTube上的“数学游戏开发者”视频系列的一段代码中找到的:
private:
union {
struct {
float m_x,m_Y;
};
};
答案 0 :(得分:1)
我已经检查了2d964cbb9e5065ec327ef6e2a5f086820ed024c1
的修订版grep
和union
,并且我找到的代码示例中最接近的匹配位于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;
}