【问题标题】:how to assign a shared pointer of type structure to a shared pointer of class type如何将结构类型的共享指针分配给类类型的共享指针
【发布时间】:2020-09-09 05:37:43
【问题描述】:

在下面的函数中,info 是一个包含getHDDList 函数的类,HDDList 是一个结构。但是当我将getHDDList 的输出分配给硬盘时,它会显示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

【问题讨论】:

  • 你能发一个minimal reproducible example吗?没有,就很难诊断您的问题。
  • 指向指针的共享指针没有意义。并且为HDDList 对象使用共享指针也没有任何意义,因为您没有使用共享指针的任何所有权语义,而只是返回原始指针。简而言之,不要对hdd 使用共享指针。实际上,我也不认为需要inf 的共享指针,或者根本不需要使用指针。为什么不简单地return info(autho).getHDDList()
  • 它工作正常。谢谢。但是如果我想将info(autho).getHDDList() 的输出放入hdd 对象中然后返回hdd 怎么办?它不应该是指针吗? @Someprogrammerdude
  • 为什么所有这些指针?
  • getHDDList 的输出是一个名称列表。 @bipll

标签: c++ shared-ptr


【解决方案1】:

或许可以试试:

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

如果你走这条路,你需要更新返回类型。

【讨论】:

  • 当我使用原始指针时同样的问题。第一个参数为空。
【解决方案2】:

这段代码有几个问题,所以让我看看我们能否解决这个问题。

首先,在您的 struct 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;
}  

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2022-07-10
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多