我可以将类成员变量设置为类函数的结果吗?

时间:2019-05-15 10:58:42

标签: c++

我在Vector类中有两个函数,x()y()从向量返回相应的分量。我希望能够使用成员变量代替(或同样)访问组件。

以前,我制作了xy指针,它们直接指向组件数组data-但这不是一个好的解决方案,因为有人可以更改指针,对吗?并且每次使用时都需要取消引用。

由于类的结构,我无法使用联合。

当前,我的想法是让成员变量xy返回函数x()y()的结果。这是可行的解决方案吗?

template <typename T>
class Vec2 : public VecBase<T, 2>
{
public:
    T& x = x();     //Doesn't work but is what I'm trying to achieve
    T& y = y();

    T& x() const { return data[0]; }
    T& y() const { return data[1]; }
}

编辑:应该更明显了-VecBase是一个可变大小的矢量(vector2,vector3等)。当大小为2时,Vec2会添加xy,以便更轻松地访问组件。如果不粘贴所有代码,很难显示出来。哈。

我想要的结果是基本上能够像这样简单地访问向量的分量:

Vec2<int> vector;
vector.x = 20;
vector.y = 40;

解决方案中不需要功能x()y()

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您的推荐成员方法可以起作用:

template <typename T>
class Vec2 : public VecBase<T, 2>
{
public:
    Vec2() : x(this->data[0]), y(this->data[1]) {}

    T& x;
    T& y;
};

但是,现在您有了用户定义的构造函数。此外,在引擎盖下仍将存在取消引用的情况。如果可能的话,我个人将完全避免这种过度复杂的情况。

尽管我知道您想以一种通用的方式来实现这一切,并且您的基地无法以一种很好的数学方式“自动”命名成员,但是请考虑您是否真的需要这个。为什么不只是几个Vec2Vec3类型,它们实际上只是直接成员呢?你真的还需要更多吗?

T作为模板参数是一个好主意。

答案 1 :(得分:1)

  

我希望能够使用成员变量访问组件

然后只需使用struct(或classpublic成员):

template <typename T>
struct Vector
{ 
    T x;
    T y;
};

Vector<int> v;
v.x = 42;
v.y = data[2];

答案 2 :(得分:0)

在没有参考成员的情况下,几乎可以实现所需的一切。您可以分配给x()的结果。

Vec2<int> vector;
vector.x() = 20;
vector.y() = 40;

请注意,您不应允许通过const Vec2进行修改,因此应根据const限定重载xy

template <typename T>
class Vec2 : public VecBase<T, 2>
{
public:
    const T& x() const { return data[0]; }
    const T& y() const { return data[1]; }

    T& x() { return data[0]; }
    T& y() { return data[1]; }
};