4

我有一个方法如下

class BuildOrderStrategy
{

public:

    virtual const Urgency& getUrgency() = 0;
    ...
}

执行如下

const Urgency& RandomBuildOrderStrategy::getUrgency()
{
    return NULL;
}

但是在编译时我收到了这个错误

error C2440: 'return' : cannot convert from 'int' to 'const Urgency &'

此时我真的想从 getUrgency 方法返回一个 NULL 值.. 所以.. 我的代码有什么问题?我该如何解决?我来自java世界,这是完全可能的..

紧急代码是这样的

class Urgency : public Investment
{
private:

public:
    Urgency(BWAPI::UnitType type1, BWAPI::UpgradeType type2, BWAPI::TechType type3);
    ~Urgency(void);
};
4

6 回答 6

3

您混淆了引用和指针。如果你返回一个引用,它不可能是NULL,因为一个引用永远不可能。如果你想返回一个指针,你需要返回Urgency*,而不是Urgency&

于 2012-11-13T05:56:11.713 回答
3

在 C++ 中,与 Java 和其他语言不同,您不能有空引用。空指针是的。但是不存在空引用的概念。

RandomBuildOrderStrategy请记住,NULL 实际上只是 0。现在停下来想一想,将 a 设置为 0有意义吗?

您可以使用 Pukku 建议的指针。

于 2012-11-13T05:57:09.287 回答
3

从这种类型的函数返回 NULL 没有多大意义。您可能想要一个指针而不是引用。

NULL 被定义为 0 (甚至 (void*)0 ),因为 0 是一个整数,它是你在这个函数中返回的,它不能与引用一起使用(它必须引用一个实际的对象)

在这种情况下,在函数中返回指向紧急对象的指针更有意义。所以尝试更改对指针的引用。

const Urgency* RandomBuildOrderStrategy::getUrgency()
{
    return NULL;
}

或者甚至尝试返回一个以特殊方式初始化的紧急类型,以便稍后检查它是否为“空”。

于 2012-11-13T06:00:12.883 回答
2

NULL如果你的函数返回一个指针,返回就可以了。当然,它没有,所以不好。

引用保证引用在行为良好的程序中有效的东西(即,没有 UB)。 NULL即使存在从int(0, NULL) 到的转换,也不会转换为有效引用const Urgency&

于 2012-11-13T05:58:10.380 回答
1

您正在尝试返回对 NULL 的引用,这在 C++ 中是不允许的

引用是用作先前定义变量的别名或替代名称的名称。

您可以更改您的 getUrgency 接口以返回指针。由于您的紧急程度是从 Investment 继承的,您可以返回 Investment* 指针

class BuildOrderStrategy
{

public:
    virtual const Investment* getUrgency() = 0;
    ...
}

const Urgency* RandomBuildOrderStrategy::getUrgency()
{
    return NULL;   
}
于 2012-11-13T05:57:38.540 回答
1

引用的返回确保函数不返回 NULL,但始终返回对对象的引用。如果你想检查 NULL 你应该返回一个指针。OTOH 如果要返回引用,请返回一个空的紧急对象。

于 2012-11-13T05:59:09.673 回答