我提供以下代码来说明我的问题。假设LargeClass是一个包含许多内部变量的类,如以下代码所示。

class LargClass
{
  public:
       std::vector<int> abc={1,2,3, ...., 10000};

}


现在假设LargeClass成为另一个类Abc的元素,如以下代码所示:

class Abc
{
 public:
       std::vector<LargeClass> obj;

};


由于在构造std::vector<LargeClass>类对象时初始化Abc的开销非常大,因此一种可行的解决方案是在构造Abc后构造std::vector<LargeClass>元素,如下所示:

Abc abcObj;

abcObj.obj.resize(3);
....
...


代替以昂贵的方式初始化std::vector<LargeClass>

class Abc
{
  public:
      Abc(std::vector<LargeClass> objTemp)
      {
            obj = objTemp;
      }
}


当然,还有其他解决方案。一种解决方案是使用指针

   class Abc
  {
public:
   Abc(std::vector<LargeClass> &obj)
   {
       pObj = &obj;
    }
std::vector<LargeClass> *pObj;
}


但是,使用此解决方案,我们必须确保给定的std::vector<LargeClass> &obj在类Abc的生存期内始终存在。为了解决此问题,另一个解决方案是使用shared_ptr

class Abc
      {
    public:
       Abc(boost::shared_ptr<std::vector<LargeClass>> obj)
       {
           pObj = obj;
        }
    boost::shared_ptr<std::vector<LargeClass> > pObj;
    }


所以我的问题是:哪种解决方案更好?对我来说,我更喜欢第一个,但它不适合面向对象编程的规则。有什么建议么?

最佳答案

使用move构造函数:

class Abc
{
public:
    Abc(std::vector<LargeClass> objTemp) : obj(std::move(objTemp)) {}

private:
    std::vector<LargeClass> obj;
};


要么

class Abc
{
public:
    Abc(std::vector<LargeClass>&& objTemp) : obj(std::move(objTemp)) {}

private:
    std::vector<LargeClass> obj;
};


如果LargeClass仅是可移动的(不可复制),则两种解决方案主要是等效的。

如果LargeClass是可复制的,我建议第二个强制正确使用。

如果您要避免复制(建议实施廉价的移动构造函数),建议删除LargeClass的复制构造函数。

关于c++ - 在C++中合并大型类元素的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38754683/

10-13 08:22