【问题标题】:Reference could be pointing struct's members in C++引用可能指向 C++ 中的结构成员
【发布时间】:2014-05-18 16:18:17
【问题描述】:

我们能否创建一个结构,其中包含一些值和指向同一结构中值的引用?我的想法是制作别名。所以我可以用不同的方式调用结构成员!

struct Size4
{    
    float x, y;
    float z, w;

    float &minX, &maxX, &minY, &maxY;

    Size4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w),
        minX(x), maxY(y), minY(z), maxY(w)
    {
    }

};

谢谢大家。

注意:我是用指针完成的,但现在当我尝试调用 Size4.minX() 时,我得到的是地址,而不是值。

struct Size4
{    
    float x, y;
    float z, w;

    float *minX, *maxX, *minY, *maxY;

    Size4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w),
        minX(&x), maxX(&y), minY(&y), maxY(&w)
    {
    }
};

【问题讨论】:

  • 是的,你可以。但是无法重新分配引用,因此我看不到太多用处。你想完成什么,你了解pointers to members吗?
  • 感谢指向成员链接的指针,但使用此解决方案,我可以通过添加解析地址操作符 (*) 来访问值。
  • 我想让它透明。尺寸4尺寸(5,5,5,5);尺寸.minX;和大小.x;返回相同的值...
  • 嗯,重点是,您可以拥有这些参考资料。
  • 请注意,必须为对象中的引用分配空间。所以对象的大小会因此而增长。

标签: c++ pointers struct reference


【解决方案1】:

“我想让它透明。Size4 size(5,5,5,5); size.minX; 和 size.x; 返回相同的值...”

你可以这样做。不过,我建议您使用class

using namespace std;
struct Size4
{
    float x, y;
    float z, w;

    float *minX, *maxX, *minY, *maxY;

    Size4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w),
        minX(&x), maxX(&y), minY(&y), maxY(&w)
    {
    }
};

int main() {
  Size4 s(1,2,3,4);
  std::cout << *(s.minX) << std::endl;
  return 0;
}

或者你可以在你的struct中添加这个方法

float getX() {
  return *minX;
}

并像这样访问它:

std::cout << s.getX() << std::endl;

但是,class 会提供更好的外壳。访问minX的私有数据成员和get-er函数。

[编辑]

使用class 很简单:

#include <iostream>

using namespace std;
class Size4
{
 private:
  // these are the private data members of the class
    float x, y;
    float z, w;

    float *minX, *maxX, *minY, *maxY;

 public:
  // these are the public methods of the class
    Size4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w),
        minX(&x), maxX(&y), minY(&y), maxY(&w)
    {
    }

    float getX() {
      return *minX;
    }
};

int main() {
  Size4 s(1,2,3,4);
  std::cout << s.getX() << std::endl;
  // std::cout << *(s.minX) << std::endl; <-- error: ‘float* Size4::minX’ is private
  return 0;
}

【讨论】:

  • 你的例子没有展示如何使用一个类,它只是在结构中重新散列了 OP 自己的指针用例。
  • 几天前我问了一个问题:stackoverflow.com/questions/23678523/… 我不能在 struct 中做同样的事情吗?
  • @dsimonet 我用课堂用法更新了我的答案!为什么要重命名一个类的成员?
  • 为了让我的代码更具可读性。而且因为我是一个初学者,有时我想做简单的思考并浪费了很多时间,因为我不知道该怎么做或者是否有可能!
  • 您链接的问题已经有一个您已经接受的答案。我想帮忙,但我不知道我要问什么。我的回答不是在这里回答了你原来的问题吗? @dsimonet
【解决方案2】:

使用解引用运算符获取您的值:*(size4.minx)

一个小例子:

Size4 sz(11, 2, 3, 4);
printf("%f, %f, %f, %f", *sz.minX, *sz.maxX, *sz.minY, *sz.maxY);

【讨论】:

  • 感谢您的回答,但取消引用正是我避免做的事情。我试图让它透明。如果我不能,我会用 get 和 set 方法上课。
  • 对我来说,有setter和getter的类会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2023-03-12
  • 1970-01-01
  • 2020-06-13
  • 2021-07-26
  • 2021-12-01
  • 2021-12-17
相关资源
最近更新 更多