定义类向量的成员变量的引用

时间:2018-02-11 16:18:17

标签: c++ class vector reference

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

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<int>引用中。 对不起如果我说了一些语法错误,英语不是我的母语。

3 个答案:

答案 0 :(得分:3)

你想要这个吗?

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;
}

答案 1 :(得分: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<int>做同样的事情,那么你可以在没有二元谓词的情况下调用相同的函数。

答案 2 :(得分:0)

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

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