[解決済み] C++でNULLオブジェクトを返す方法
質問
と重複してしまうかもしれませんが 検索結果が見つからない場合、"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 temporary
と
conversion 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を返せるようになります。
関連
-
[解決済み] C++とCの融合 - #ifdef __cplusplus はどのように機能するのか?
-
[解決済み] C++でenumを前方に宣言する
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?
-
[解決済み】派生クラスでオーバーライドされた関数が、ベースクラスの他のオーバーロードを隠してしまうのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】'std::cout'への未定義の参照