質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

856閲覧

フォワード宣言について

konataro

総合スコア37

Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/02/16 09:40

編集2019/02/16 09:44

cppファイルで使用するクラスをincludeすぐ後に宣言(フォワード宣言?)する理由がわかりません。
正しいかわかりませんが、例えば下記のようにUClassをExample.hの最初にフォワード宣言して、Example.cppではクラスUClassが宣言してあるUClass.hを呼び出している場合などです。

Example.h

C++

1#include "~.h" 2 3class UClass; 4 5class AClasss 6{ 7public: 8 void AClass(); 9 10private: 11 UClass* TestClass = nullptr; 12}; 13

Example.cpp

C++

1#include "Example.h" 2#include "UClass.h" 3 4void AClass::AClass() 5{ 6 TestClass->GetObject(); 7} 8

回答お願いいたしますm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コンパイル時に『UClassというクラスが有りますよ』ということを確定させるためです。
その意味では関数のプロトタイプ宣言と役割は一緒です。

C:...>type tera1.cpp class Hoge; class Fuga { Hoge *ptr; }; C:...>g++ -c tera1.cpp C:...>type tera2.cpp class Fuga { Hoge *ptr; }; C:...>g++ -c tera2.cpp tera2.cpp:2:5: error: 'Hoge' does not name a type Hoge *ptr; ^~~~

不要なインクルードを排除したり、循環参照を避けたりする際に有用です。

投稿2019/02/16 09:52

編集2019/02/16 09:58
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konataro

2019/02/16 10:01

回答ありがとうございます。 冷静に考えてみればコンパイル?するときにそのファイル内で宣言されていないクラスが急に出てくるわけですから、エラーとなりますよね。
LouiS0616

2019/02/16 10:07

C/C++の広義のコンパイルはざっくり言うと三段階に分かれています。 ・プリプロセス ・狭義のコンパイル ・リンク クラスや関数をコード内で使っているときは、何らかの形で宣言が無いと狭義のコンパイルが通りません。
LouiS0616

2019/02/16 10:10

実際に前方宣言をコメントアウトすると同じようなエラーが出るかと思います。 "~.h"の中身が見えないので断言はできませんが。
guest

0

Example.h と、Example.c に矛盾がないかをチェックするためです
矛盾があったり、なにか間違いがあれば、このおかげでコンパイル時にチェックできます

投稿2019/02/16 09:45

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konataro

2019/02/16 09:56

回答ありがとうございます。つまり、Example.h→Example.cppといった形でコンパイルされるとき、Example.h内のUClassは先に宣言しておけば.h内での矛盾はなくなり、 次にExample.cppでincludeされているUClass.hを読み込み、先にExample.h内で宣言していたUclassに上書きしているということでしょうか?
y_waiwai

2019/02/16 10:08

それだけで矛盾はなくなりませんし、上書きもされません 矛盾がある場合にコンパイルエラーでそれと知ることができるということです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問