定义一个类的vector的成员变量的引用

Posted

技术标签:

【中文标题】定义一个类的vector的成员变量的引用【英文标题】:Define a reference of the member variable of a vector of a class 【发布时间】:2018-02-11 16:18:17 【问题描述】:

这段代码解释了我想要做的一个例子:

class Object

public:
    int data;

    Object() : data(0) 
    Object(int data) : data(data) 
;

int dataSum(vector<int>& dataReference)

    int sum = 0;
    for(int i = 0; i < dataReference.size(); i++)
    
         sum += dataReference[i];
    
    return sum;


int main()

    vector<Object> myObject(5);
    int mySum = dataSum(myObject.data); // this line does not work

    return 0;

很明显,使 dataSum 成为 Object 的成员函数可以更容易地完成,但这不是我要问的。我怎样才能只引用 myObject.data?或者如果不能用引用来做,至少用指针做同样的事情。

编辑:有人告诉我这个问题不清楚。 我想要做的是引用myObject[i].data 的每个整数,将它们放在vector&lt;int&gt; 引用中。 也很抱歉,如果我输入了一些语法错误,英语不是我的母语。

【问题讨论】:

你为什么试图传递myObject.data?你希望它做什么? 我什至无法想象将int 传递给接受std::vector 的函数的最初目的。 要将引用存储在std::vector 中,您可以使用std::reference_wrapper @Ron 它没有通过int 你的代码应该做什么?您的代码没有解释任何内容。 【参考方案1】:

你想要这个吗?

int dataSum(const vector<Object>& dataReference)

  int sum = 0;
  for (int i = 0; i < dataReference.size(); i++)
  
    sum += dataReference[i].data;
  
  return sum;


int main()

  vector<Object> myObject 1,2,3,4 ;
  int mySum = dataSum(myObject); // mySum will be 1+2+3+4 (=10) here.

  return 0;

或更好:

int dataSum(const vector<Object>& dataReference)

  int sum = 0;
  for (const auto & object : dataReference)
  
    sum += object.data;
  
  return sum;

【讨论】:

是的,但是这段代码引用了整个 myObject。我只想引用 myObject.data 的整数,因为这个函数应该适用于另一个向量 @Rafael 您不能直接执行此操作;如果您有一个对象向量,则无法将该向量传递给需要整数向量的函数。有点不清楚。 那么,如果函数需要保持不变,唯一的方法是创建每个 myObject.data 的副本到一个新的 vector 中并将其传递给函数? @Rafael 是的,但那将是低效的。也许 Arnav Borborah 的答案就是您所需要的【参考方案2】:

为什么不能使用std::accumulate

vector<Object> myObject(5)  1, 2, 3, 4, 5 ;
int mySum = std::accumulate(myObject.begin(), myObject.end(), 0, 
            [](int init, const Object& obj)
            
                return init + obj.data;
            ); // mySum = 15

这首先消除了对函数的需求,并通过简单的函数调用实现了您想要的!

如果你想用std::vector&lt;int&gt; 做同样的事情,那么你可以在没有二元谓词的情况下调用相同的函数。

【讨论】:

函数 dataSum 只是一个例子。我想要使​​用的功能更复杂。我只想将每个 myObject[i].data 的整数作为 vector 引用。谢谢您的回复,但这不是我所要求的。对不起,如果我没有说清楚... @Rafael 如果这是您需要的,那么您将必须实现某种模板函数,该函数接受二进制谓词和迭代器并执行相同的操作。 可以以std::accumulate的实现为例(我链接到的)【参考方案3】:

您正试图将std::vector&lt;Object&gt;&amp; 传递给签名需要std::vector&lt;int&gt;&amp; 的方法。如果您想处理 Object 类型的向量,那么这就是您需要实现的。如果你想使用你为dataSum定义的方法,那么你需要像这样使用它。

std::vector<int> numVec = 1, 2, 3, 4, 5;
Object obj;
int sum = obj.dataSum(numVec);

【讨论】:

以上是关于定义一个类的vector的成员变量的引用的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的类成员变量是存在堆还是栈里面呀?

成员变量 局部变量

子类能继承父类的哪些变量和方法

C++,如何从迭代器返回对成员变量的引用

如何初始化一个类的引用成员变量?

继承中成员的访问特点