如何将类型结构的共享指针分配给类类型的共享指针

问题描述

在下面的函数中,info是一个包含getHDDList函数的类,而HDDList是一个结构。但是当我将getHDDList的输出分配给hdd时,它显示为no operator "=" matches this operands

HDDList* smc_getHDDList(Authorization* autho)
{
    HDDList retVal;
    //HDDList* hdd = new HDDList;
    std::shared_ptr<info> inf (new info(autho));
    std::shared_ptr<HDDList> hdd ;
    try
    {
        //inf.get()->getHDDList();
        //hdd = inf.get()->getHDDList();
    }
    catch (const std::invalid_argument& e)
    {
        THROW_EXCEPTION
    }
    return hdd;
}

这是我的HDDList结构:


struct HDDList
{
    const char* name;
    double totalSize;
    double freeSize;
    double usedSize;
};

这是getHDDList函数:


HDDList* info::getHDDList()
{
    int num;
    num = std::stoi(numberOfHDDs());
    HDDList* list = new HDDList[num];
    for (int i = 0; i < num; i++)
    {
        list[i].name = listOfHDDs(i);
    }
    return list;
}

我之所以使用共享指针,是因为当我使用原始指针并在返回之前删除指针时,我在接收结构时遇到了问题(它没有返回结构的第一个成员)。
如何将getHDDList的输出分配给hdd

解决方法

可能可以尝试类似的东西:

hdd.reset(inf->getHDDList());

如果您选择此路线,则需要更新退货类型。

,

此代码有两个问题,所以让我看看是否可以正确解决这个问题。

首先,在结构HDDList中,您有一个const指针名称;这指向哪里?

我认为,如果将其声明为std::string会更好,以便在销毁节点时将其自包含。

struct HDDList
{
  std::string name;
  double totalSize;
  double freeSize;
  double usedSize;
};

否则,如果名称指向某些已分配的字符串,则将需要处理该字符串以及HHDList或unique_ptr的自定义删除程序中的析构函数。

您要在函数getHDDLists()中创建HDDList数组

HDDList* info::getHDDList() {...}

请注意,您没有返回数组的大小。因此,调用方无法知道数组的长度,因为它只是获得了指向数组起始位置的指针。

(如果您的数据中没有未提及的秘密标记)。

因此,我们增加大小并返回包装在unique_ptr中的数组:

std::unique_ptr<HDDList[]> info::getHDDList(int& num)
{
  num = std::stoi(numberOfHDDs()); 
  auto list = std::make_unique<HDDList[]>(num);
  for (int i = 0; i < num; ++i)
  {
    list[i].name = listOfHDDs(i);
  }
  return list;
}  

在调用程序函数中,您现在可以获得数组大小以及包装在智能指针中的数组的信息:

HDDList* smc_getHDDList(Authorization* autho)
{
  auto inf = std::make_unique<info>(autho);
  std::unique_ptr<HDDList[]> hdd;
  try
  {
    int hddSize{0};
    hdd = inf->getHDDList(hddSize);
    ...
  }
  catch (const std::invalid_argument& e)
  {
    // write out exception
    // rethrow if you want
  }
  return hdd;
}  

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...