1. ホーム
  2. c++

[解決済み] C++でNULLオブジェクトを返す方法

2022-02-02 07:05:57

質問

と重複してしまうかもしれませんが 検索結果が見つからない場合、"NULL"オブジェクトを返します。

しかし、私のコードでは何か違うことが起こっています。アスタリスクは私の問題を解決してくれないからです。

Normal Sphere::hit(Ray ray) {
   //stuff is done here
   if(something happens) {
       return NULL;
   }
   //other stuff
   return Normal(something, somethingElse);
}

を参照するエラーが発生します。 return NULL という行があります。 conversion from ‘int’ to non-scalar type ‘Normal’ requested

そして、最後の戻り行を参照する別のエラーと警告。 warning: taking address of temporaryconversion from ‘Normal*’ to non-scalar type 'Normal' requested

なぜこの警告が出るのかは理解できましたが、どうすればいいのかわかりません。どのようにすれば Normal オブジェクトを返し、関数が終了した後も持続させることができます。 NULL オブジェクトを作成することはできますか?(こういう返し方の用語があれば、私ももっと勉強したいので教えてください)

コメントされた方の質問を明確にするために、こんなことを試してみました。

こんなことをやってみました。 Normal *Sphere::hit(Ray ray) を cpp ファイルに、そして Normal *hit( Ray ray ); をヘッダーファイルで実行すると、このエラーが発生します。 error: prototype for ‘Normal* Sphere::hit(Ray)’ does not match any in class 'Sphere'

また、こんなこともやってみました。 Normal Sphere::*hit(Ray ray) を cpp ファイルに、そして Normal *hit( Ray ray); をヘッダーファイルに追加すると、2つ目のreturn文でこのエラーが発生します。 cannot convert 'Normal*' to 'Normal Sphere::*' in return

さらに明確化する。 ポインターの仕組みについて聞いているのではありません。(C++のポインターに関するシンタックスについて質問しているのです。つまり、私が上で指定した関数から、C++にはnullオブジェクトがないから、ポインタを返すと指定するべきだということがわかりました。なるほど。しかし、問題は、関数のプロトタイプをどうするかだ。cppファイルには、Balaが提案したようなものがある(これは元々あったものだが、以下のエラーが出たので変更した)。

Normal* Sphere::hit(Ray ray) {
   //stuff is done here
   if(something happens) {
       return NULL;
   }
   //other stuff
   return new Normal(something, somethingElse);
}

ヘッダーファイルの中で Normal *hit(Ray ray) というメッセージが表示されます。 prototype for 'Normal* Sphere::hit(Ray)' does not match any in class 'Sphere' この時点では、なぜその関数プロトタイプが見つからないのか、私には不明です。以下は、そのヘッダーファイルです。

class Sphere
{
    public:
        Sphere();
        Vector3 center;
        float radius;
        Normal* hit(Ray ray);
};

にマッチするプロトタイプが存在しないと文句を言う理由がわかる人はいますか? hit の中で Sphere クラスですか?(これは別の質問に移すかもしれませんが...)

どのように解決するのですか?

のようなものが必要だと思います。

Normal* Sphere::hit(Ray ray) {
   //stuff is done here
   if(something happens) {
       return NULL;
   }
   //other stuff
   return new Normal(something, somethingElse);
}

を使えば、NULLを返せるようになります。