在两个类实例之间共享向量

时间:2018-07-11 16:19:55

标签: c++ vector

我得到向量大小的值为10,我知道有两个不同的实例,但是我希望它们在两个实例之间是通用的

我不确定什么是正确的方法是否需要一些见解来满足我的情况。

#include <iostream>
#include <memory>
#include <vector>

class Fruit
{
  public:
   Fruit(std::vector<int>& number);
   Fruit();
  int numOfApple();
  private:
  std::vector<int> number;
};

Fruit::Fruit() {}

class Apple
{
  public:
  Apple();
  Apple(Fruit &fruit);
  int appleCount();

  private:
  Fruit fruit;

};

Apple::Apple() {}

Apple::Apple(Fruit &fruit):fruit(fruit) {}

int Fruit::numOfApple()
{
  std::cout<<"vector size is"<<number.size()<<std::endl;
  for (auto& fruz : number) {
   std::cout<<"do nothing"<<std::endl;
  }

  return 0;
}


int Apple::appleCount()
{
  fruit.numOfApple();
  return 0;
}

Fruit::Fruit(std::vector<int>& number):number(number) {}

int main()
{
  std::vector<int> fru;
  fru.push_back(1);

  Fruit fruit1(fru);

  Apple apple(fruit1);
  fruit1.numOfApple(); // the size of the vector here is 1

  // Now try to simulate server code

  Fruit fruit2;
  fruit2.numOfApple(); // the size of vector in this is 0

  return 0;
}

输出

./a.out
vector size is1
do nothing
vector size is0

1 个答案:

答案 0 :(得分:2)

您可以为此使用std::shared_ptr。只要引用它的任何对象都存在,它就可以存在,并且允许多个对象共享其内容的所有权。

class Fruit
{
  Fruit::Fruit()
    : number(std::make_shared<std::vector<int>>())
  {}

  Fruit(std::vector<int>& numberNew)
    : number(std::make_shared<std::vector<int>>(numberNew))
  {}

  std::shared_ptr<std::vector<int>> number;
}

现在,当您复制类时,shared_ptr的副本将不会复制矢量,而只是引用相同的矢量并为您处理所有生命周期管理。

int Fruit::numOfApple()
{
  std::cout << "vector size is" << number->size() << std::endl;
  for (auto& fruz : *number) {
   std::cout << "do nothing" << std::endl;
  }

  return 0;
}

除非绝对必要,否则我强烈建议您不要制作static。这里没有必要,您可以立即寻求适当的解决方案,以防止将来出现增长难题。