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