在下面的函数中,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中,您有一个常量指针名称;这指向哪里?
我认为,如果您将其声明为std::string
,以便在节点被销毁时它是自包含的,那会更好。
struct HDDList
{
std::string name;
double totalSize;
double freeSize;
double usedSize;
};
否则,如果名称指向某个已分配的字符串,则需要在HHDList或unique_ptr的自定义deleter中处理该字符串以及析构函数。
您想在函数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;
}