【问题标题】:Define a reference of the member variable of a vector of a class定义一个类的vector的成员变量的引用
【发布时间】: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
  • 你的代码应该做什么?您的代码没有解释任何内容。

标签: c++ class vector reference


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多