возвращает NULL, но получает ошибку C2440: «return»: невозможно преобразовать из «int» в «const & amp;»

У меня есть метод, который следует

class BuildOrderStrategy
{

public:

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

какая реализация следует

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

но во время компиляции я получаю эту ошибку

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

в настоящее время я действительно хочу вернуть значение NULL из метода getUrgency.
так .. в чем проблема с моим кодом? как я могу это исправить?
Я пришел из мира Java, где это вполне возможно ..

Код срочности это

class Urgency : public Investment
{
private:

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

4

Решение

Возврат NULL из этого типа функции не имеет большого смысла. Вы, вероятно, хотите указатель, а не ссылку.

NULL определяется как 0 (или даже (void *) 0), и поскольку 0 — это целое число, которое вы возвращаете в этой функции, которая не работает со ссылкой (которая должна ссылаться на реальный объект)

В этом случае возврат указателя на объект Urgency в вашей функции имеет больше смысла. Поэтому попробуйте изменить ссылку на указатель.

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

Или даже попробуйте вернуть тип срочности, который был инициализирован особым образом, что позволило позже проверить, является ли он «пустым».

3

Другие решения

Вы путаете ссылки и указатели. Если вы вернете ссылку, она не может быть NULLпотому что ссылка никогда не может. Если вы хотите вернуть указатель, вам нужно вернуть Urgency*не Urgency&,

3

В C ++, в отличие от Java и других, вы не можете иметь нулевую ссылку. Нулевые указатели да. Но концепция нулевой ссылки не существует.

Помните, что NULL на самом деле просто 0. Теперь остановитесь и подумайте на секунду, имеет ли смысл установить RandomBuildOrderStrategy до 0?

Вы можете использовать указатель как предложено Pukku.

3

возврате NULL было бы хорошо, если бы ваша функция вернула указатель. Конечно, это не так, так что это не хорошо.

Ссылки гарантированно ссылаются на что-то действительное в программе с хорошим поведением (то есть без UB). NULL не будет преобразован в действительную ссылку, даже если существует преобразование из int (0, NULL) до const Urgency&,

2

Возвращение ссылки гарантирует, что функция не возвращает NULL, но всегда возвращает ссылку на объект. Если вы хотите проверить NULL, вы должны вернуть указатель. OTOH, если вы хотите вернуть ссылку, верните пустой объект Urgency.

1

Вы пытаетесь вернуть ссылку на NULL, которая не разрешена в C ++

Ссылка является
имя, которое действует как псевдоним или альтернативное имя для ранее определенной переменной.

вместо этого вы можете изменить интерфейс getUrgency для возврата указателя. Поскольку ваша срочность наследуется от инвестиций, вы можете вернуть указатель на инвестиции *

class BuildOrderStrategy
{

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

const Urgency* RandomBuildOrderStrategy::getUrgency()
{
return NULL;
}
1
По вопросам рекламы [email protected]