我有一个跟随
的方法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);
};
答案 0 :(得分:3)
你混淆了引用和指针。如果您返回引用,则它不能是NULL
,因为引用永远不能。如果要返回指针,则需要返回Urgency*
,而不是Urgency&
。
答案 1 :(得分:3)
在C ++中,与Java等不同,您不能使用空引用。空指针是的。但是不存在空引用的概念。
请记住,NULL实际上只是0.现在停下来思考一下,将RandomBuildOrderStrategy
设置为0是否有意义?
您可以按照Pukku的建议使用指针。
答案 2 :(得分:3)
从这种类型的函数中返回NULL并没有多大意义。您可能希望指针不是引用。
NULL被定义为0(或者甚至(void *)0)并且因为0是一个整数,它是你在这个函数中返回的,它不能用于引用(它必须引用一个实际的对象)< / p>
在这种情况下,在函数中返回指向Urgency对象的指针更有意义。因此,请尝试将引用更改为指针。
const Urgency* RandomBuildOrderStrategy::getUrgency()
{
return NULL;
}
甚至尝试返回一个以特殊方式初始化的Urgency类型,以便稍后检查它是否为“空”。
答案 3 :(得分:2)
如果函数返回指针,则返回NULL
会很好。当然,它没有,所以它并不好。
保证引用是指在行为良好的程序中有效的东西(即,没有UB)。即使存在从NULL
(0,NULL)到int
的转换,const Urgency&
也不会转换为有效的引用。
答案 4 :(得分:1)
您正在尝试返回对C ++
中不允许的NULL引用参考是一个 用作先前定义的变量的别名或替代名称的名称。
您可以更改getUrgency接口以返回指针。由于您的紧急程度是继承自投资,您可以返回投资*指针
class BuildOrderStrategy
{
public:
virtual const Investment* getUrgency() = 0;
...
}
const Urgency* RandomBuildOrderStrategy::getUrgency()
{
return NULL;
}
答案 5 :(得分:1)
返回引用可确保函数不返回NULL,但始终返回对象的引用。如果要检查NULL,则应返回指针。 OTOH如果你想返回一个引用,返回一个空的Urgency对象。