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

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

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

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

Q&A

解決済

1回答

3852閲覧

【C++】 メンバ関数の前方宣言

torimingo

総合スコア122

C++

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

0グッド

0クリップ

投稿2019/04/06 22:37

編集2019/04/06 22:55

クラスの前方宣言は「class ClassName;」となると思いますが、メンバ関数を前方宣言したい場合は、どのように書けばいいのでしょうか。
ファイルを分割すれば問題ないことではあるのですが、ひとつのファイルに収めたいため、質問させて頂きました。

以下にコードを示します。

C++

1#include<vector> 2#include<iostream> 3using namespace std; 4 5class Body; 6class Parent; 7class Child; 8 9class Parent 10{ 11public: 12 Parent(Body* body) : 13 mBody(body) 14 { 15 mBody->addParent(this); 16 } 17 18 void update() 19 { 20 updateParent(); 21 } 22 23 virtual void updateParent() 24 { 25 } 26 27private: 28 Body* mBody; 29}; 30 31class Child : public Parent 32{ 33public: 34 Child(Body* body) : 35 Parent(body) 36 { 37 } 38 39 virtual void updateParent() override 40 { 41 cout << "child" << endl; 42 } 43}; 44 45class Body 46{ 47public: 48 void initialize() 49 { 50 mChild = new Child(this); 51 } 52 53 void addParent(Parent* parent) 54 { 55 mParents.emplace_back(parent); 56 } 57 58 void runloop() 59 { 60 for(Parent* p : mParents){ 61 p->update(); 62 } 63 } 64 65private: 66 Child* mChild; 67 vector<Parent*> mParents; 68}; 69 70int main() 71{ 72 Body body; 73 body.initialize(); // オブジェクトの生成 74 body.runloop(); // メインループ 75 76 return 0; 77};

以下のエラーが出力されます。

test.cpp:15:8: error: invalid use of incomplete type ‘class Body’ mBody->addParent(this);

ParentクラスからaddParent()が見えないといっている模様です。

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

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

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

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

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

episteme

2019/04/06 22:41

メンバ関数を前方宣言しないとマズいケースを挙げていただけませんか?
torimingo

2019/04/06 23:00

コードを追記しましたので、ご確認下さい。
guest

回答1

0

ベストアンサー

これじゃダメっすか?

C++

1class Parent 2{ 3public: 4 Parent(Body* body); // 宣言のみ 5 6 void update() { updateParent(); } 7 virtual void updateParent() {} 8private: 9 Body* mBody; 10}; 11 12... ChildとBodyの宣言/定義のあとで 13 14// Parent::PArent の定義 15inline Parent::Parent(Body* body) : mBody(body) { 16 mBody->addParent(this); 17} 18 19int main() { 20 Body body; 21 body.initialize(); // オブジェクトの生成 22 body.runloop(); // メインループ 23 24 return 0; 25};

投稿2019/04/06 23:54

episteme

総合スコア16614

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

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

torimingo

2019/04/07 00:05

ご回答ありがとうございます。 正常に動作しましたー。 ちなみに、inlineは、必須ですか? epistemeさんは、どのようなときに、inlineを付与していますか?
episteme

2019/04/07 00:10 編集

non-inlineな関数をヘッダで定義すると、そいつが何か所かで#includeされたとき定義の重複でlink-errorになるんちゃうかな。
torimingo

2019/04/07 00:13

なるほど・・・。なんとなくわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問