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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

3回答

11797閲覧

別ファイルのクラスの参照方法

torimingo

総合スコア122

C++

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

0グッド

0クリップ

投稿2019/07/22 01:00

とあるコードを読んでいて、別ファイルのクラスを参照するときに、ヘッダファイルをインクルードする方法と、使用するクラスを自ファイルで宣言する方法があることを発見しました。しかし、どのように違うのかがわかりません。
コードを以下に示します。
質問したい箇所は、a.hの5、6行目です。

main.cpp

c++

1 2#include "a.h" 3#include "b.h" 4 5int main() 6{ 7 A a; 8 B b; 9 a.func(b); 10 return 0; 11}

a.h

c++

1#ifndef A_h 2#define A_h 3 4// class Bを参照するには以下の2つの方法がある 5class B; 6//#include "b.h" 7 8class A 9{ 10public: 11 void func(B& b); 12}; 13 14#endif

a.cpp

C++

1#include "a.h" 2 3void A::func(B& b) 4{ 5 return; 6}

b.h

c++

1#ifndef B_h 2#define B_h 3 4class B 5{ 6 int i; 7}; 8 9#endif

上記のa.hのなかで「class B;」を使うのと「#include "b.h"」を使うのとでは、どのような違いがあるのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

class B;というのは、不完全型の宣言です。文字通り「これはクラスです」ということしか宣言できていないので、そのクラスへの参照やポインタを含む宣言はできるようになりますが、関数内で使うことはできません。

ふつうは#includeして使うのですが、「class Aが内部でclass B&を使っていて、class Bclass A*を使っている」ような場合、#includeでは循環参照になってうまくいかないので、別個でclass B;という宣言が必要となります。

(今回の場合はそのような特殊事情がないので、#includeを使うのが適切です)

投稿2019/07/22 01:06

maisumakun

総合スコア145121

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

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

fana

2019/07/22 01:14

> 今回の場合はそのような特殊事情がないので、#includeを使うのが適切です 前方宣言だけで済むならば,それで済ます方が良いと思うのですが,どうなんでしょう.
guest

0

includeは,includeしたファイルの全てがその場所にコピーされる.
今回の場合,Bクラスの定義全てが見えるようになる.

class B; は前方宣言.Bってのはclassだよっていうことを宣言するだけ.

投稿2019/07/22 01:03

fana

総合スコア11632

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

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

fana

2019/07/22 04:35

他の方の回答ではincludeを使う方を推奨されているけれども,私は逆の考え. class Aを使用する側がclass Bの実体をも知る必要があるか否かに関しては利用側の都合なのであって,a.hを利用する側へ常にb.hへの依存を強制するのは良くない. 利用側は必要であれば,a.hとb.hの両方をincludeすれば良いし,不要ならばa.hだけをincludeすれば良い.
guest

0

どっちもいっしょです
ただ、自ファイルの定義では、そのファイルの中でしか使えないけど、
ヘッダファイルで定義しとけば、複数のファイルでそれを使う必要があるときに、インクルード文書くだけで使えるようになりますね

投稿2019/07/22 01:02

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問