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

Java などとは異なり、C++ では null 参照を使用できません。ヌルポインタはい。しかし、null 参照の概念は存在しません。

NULL は実際には 0 であることを思い出してください。ここで少し立ち止まって考えてみてください。a をRandomBuildOrderStrategy0 に設定することに意味があるのでしょうか?

Pukku が提案するポインターを使用できます。

于 2012-11-13T05:57:09.287 に答える
3

このタイプの関数から NULL を返すことはあまり意味がありません。おそらく、参照ではなくポインターが必要です。

NULL は 0 (または (void*)0 ) として定義されており、0 はこの関数で返される整数であるため、参照では機能しません (実際のオブジェクトを参照する必要があります)。

この場合、関数で Urgency オブジェクトへのポインターを返す方が理にかなっています。そのため、参照をポインターに変更してみてください。

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

または、「空」かどうかを後で確認できる特別な方法で初期化された Urgency 型を返してみてください。

于 2012-11-13T06:00:12.883 に答える
2

NULL関数がポインターを返した場合、戻りは問題ありません。もちろんそんなことはありませんので、ダメです。

参照は、正常に動作するプログラム (つまり、UB なし) で有効なものを参照することが保証されています。 (0, NULL) から へNULLの変換が存在する場合でも、有効な参照に変換されません。intconst Urgency&

于 2012-11-13T05:58:10.380 に答える
1

C++ では許可されていない NULL への参照を返そうとしています。

参照は、以前に定義された変数の別名または代替名として機能する名前です。

getUrgency インターフェイスを変更して、代わりにポインターを返すことができます。Urgency は 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 参照を返したい場合は、空の Urgency オブジェクトを返します。

于 2012-11-13T05:59:09.673 に答える