Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将结构类型的共享指针分配给类类型的共享指针_C++_Shared Ptr - Fatal编程技术网

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

C++ 如何将结构类型的共享指针分配给类类型的共享指针,c++,shared-ptr,C++,Shared Ptr,在下面的函数中,info是一个包含getHDDList函数的类,HDDList是一个结构。但是当我将getHDDList的输出分配给硬盘驱动器时,它会说no operator“=”与这个操作数匹配: HDDList* smc_getHDDList(Authorization* autho) { HDDList retVal; //HDDList* hdd = new HDDList; std::shared_ptr<info> inf (new info(au

在下面的函数中,
info
是一个包含
getHDDList
函数的类,
HDDList
是一个结构。但是当我将
getHDDList
的输出分配给硬盘驱动器时,它会说
no operator“=”与这个操作数匹配

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

HDDList*info::getHDDList()
{
int-num;
num=std::stoi(numberOfHDDs());
HDDList*list=新的HDDList[num];
for(int i=0;i

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

可以尝试以下方法:

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

如果您选择此路线,您需要更新返回类型。

此代码存在一些问题,请让我看看我们是否可以正确执行此操作

首先,在struct HDDList中有一个常量指针名称;这指向哪里

我认为如果您将其声明为
std::string
,以便在节点被破坏时它是自包含的,那么您的情况会更好

struct HDDList
{
  std::string name;
  double totalSize;
  double freeSize;
  double usedSize;
};
否则,如果名称指向某个已分配的字符串,则需要在HHDList或自定义删除程序中处理该字符串,以获得unique_ptr

您想在函数getHDDLists()中创建一个HDDList数组

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

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

因此,让我们添加大小并返回一个封装在唯一\u 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;
}  
std::unique\u ptr info::getHDDList(int&num)
{
num=std::stoi(numberOfHDDs());
自动列表=标准::使_唯一(num);
对于(int i=0;i
在调用者函数中,您现在拥有数组加上封装在智能指针中的数组的大小信息:

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;
}  
HDDList*smc\u getHDDList(授权*autho)
{
auto inf=std::使_唯一(autho);
std::唯一的ptr硬盘驱动器;
尝试
{
int hddSize{0};
hdd=inf->getHDDList(hddSize);
...
}
catch(const std::无效的参数&e)
{
//写出例外情况
//如果你想的话,可以再叫一次
}
返回硬盘驱动器;
}  

你能帮我发一封信吗。如果没有,很难诊断您的问题。指向指针的共享指针毫无意义。对
HDDList
对象使用共享指针也没有意义,因为您没有使用共享指针的任何所有权语义,只返回原始指针。简而言之,不要对
hdd
使用共享指针。实际上,我不认为有必要为
inf
使用共享指针,也不认为有必要使用指针。为什么不干脆
返回信息(autho).getHDDList()
?它可以正常工作。谢谢但是,如果我想将
info(autho).getHDDList()
的输出放入类似
hdd
对象的内容中,然后返回
hdd
,该怎么办呢?不应该是指针吗@一些程序员问为什么所有这些指针?getHDDList的输出是一个名称列表@当我使用原始指针时,我也遇到了同样的问题。第一个参数为空。
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;
}