问题描述
在下面的函数中,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;
}