【问题标题】:could not convert ‘0l’ from ‘long int’ to ‘MemoryManager’无法将“0l”从“long int”转换为“MemoryManager”
【发布时间】:2012-01-19 14:57:27
【问题描述】:
MemoryManager openMemory() {
  if (...) {
    return memory_manager_instance;
  }
  else 
    return NULL;
}

MemoryManager 是用户定义的 C++ 类的名称。上面的函数定义给了我标题中的错误。

基本上我不想在条件不成立时返回实例。这种函数定义是有效的,也是我通常在 Java 中所做的,但它似乎不适用于 C++。我应该怎么做才能解决这个问题?

【问题讨论】:

  • Java 只有指针,这就是为什么你可以返回 NULL 对象。在 C++ 中,您的代码需要 MemoryManager 中的转换构造函数,该构造函数不存在或者是显式的。您可能打算返回一个指针而不是一个值。您也可能需要抛出异常或返回默认的初始化对象 - 无法从您的问题中看出。
  • 阅读 mkb 的答案,以便您了解正在发生的事情。然后,在这个特定实例中返回 NULL 可能不是你想要的——你可能应该抛出一个异常(正如@Gene 所说)。

标签: c++ class function null type-conversion


【解决方案1】:

让你的函数返回一个MemoryManager *(可能使用 C++ 库或 boost 中可用的几个智能指针类之一)。如果MemoryManager 是一个类的名称,那么编写的这个函数将返回memory_manager_instance 的副本。这与 Java 不同,在 Java 中,MemoryManager 类型的变量将是对对象的引用。

编辑:此外,您似乎正在尝试实现单例。您希望将MemoryManager 的默认构造函数、复制构造函数和赋值运算符设为私有或受保护。前两个也在 Java 中,但不是最后一个!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多