忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

インクルードの使い方がヤバい

どうも、合評会で司会をしてました。
村上こと克兎です。

なぜか自己紹介記事が流行っていますね。

私も、書きたくなりましたがまた今度にします。

他のGESメンバーと違って、
私の記事は非常に薄っぺらいので、仕方ないです。

拍手[2回]


さて、
今回ふれますのは

インクルードの色々な使い方です

普通にヘッダをインクルード
するだけなら、多分たくさんの人がやったことあるんじゃないかなと思います。

Visual Studioに登録されているヘッダなら

#include<~~.h>

自作のヘッダなら

#include"~~.h"

みたいな感じです。

インライン関数を使っている方なら

#include "~~.inl"

みたいなのを書いてる方も多いかもしれません

本来このinlファイルは、コンパイル上、
hファイルと何ら変わりありません

インライン関数の実体をまとめて置いておく際に
hファイルだと、命名の重複の可能性があったり、
クラスヘッダ等との、見分けが難しいためです。




このinlファイルを使ったテクニックとして、

「クラスのメンバ関数の隠ぺいをする」という物があります。
(※Visual Studio 2008でのみ確認)

中村君のオブジェクト指向セミナーが以前ありましたが、
カプセル化の概念上、
1つのクラスにはプライベートなメンバが多く存在する場合があります。

内部的には使用していますが、外部からすると、まったく関係のない個所です。

なのに、Visual Studioは予測表示等で、外部からこいつらを閲覧させちゃってくれます。

Include0.PNG
これは邪魔なので隠しちゃいましょう。

main.cpp
class Test{

#Include "PriveInl.inl"

public:

 int PublicMember0;
 int PublicMember1;
 int PublicMember2;

};

int main(){

 Test a;

}

ソース内に
#include "PrivInl.inl"

と書いてやります。

PriveInl.inl

private:
 int PrivateMember0; 
 int PrivateMember1;
 int PrivateMember2;
 

PrivInl.inlの中に、プライベートメンバを書いてやります。
すると…

Include1.PNG

なんと、予測リストから消えました!

ある程度、完成したクラスなら、
このようにしてプライベートメンバを、隠ぺいし、使いやすくしてやるのもいいかもしれません。



また、
インクルードをうまく使い、
テンプレート関数をもったクラスのメンバをcppに書く

という方法があります。

テンプレート関数は、インラインでなければ、定義することができません。
そのために、inlファイルがあるわけですが、
これをcppに書いてやりましょう。

Test.h

#pragma once //これがないとcppの中身が無効なソースになる
#ifndef TEST_INC
#define TEST_INC

class Test{

public:
 template< class T >
 T Func ( T Val );

};

#include "Test.cpp"
#endif
 


Test.cpp

#ifdef TEST_INC //インクルードされていなければ無視する

template < class T >
T Test::Func( T Val ){

 return Val;

}

#endif
 

ヘッダ側でcppをインクルードしています。
また、cppが、ヘッダより先にコンパイルにかけられる可能性があるので
ヘッダ側のインクルードガードを流用し、コンパイルガードをしています。

このようにすることで、テンプレートなどのインライン関数の実体をcpp側に書くことができます。


どうでしょう
たかがインクルードといえども、
他にも色々な使い方があるかもしれません。

何か、いいアイディアがありましたら、教えてください!!

そ~れ~で~は~(*´∀`)ノ

追記:
メンバの隠ぺいはVisual Studio 2010ではできないようです。
インテリセンスに大幅な変更があったためだそうです。
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

No Title

  • by リーダ和田
  • 2012/07/02(Mon)21:43
  • Edit

すべての.cppをコンパイルしないで
すべての.cppをインクルードしたファイルを一つだけ用意
してそれをコンパイルすると、最小限のincludeで済むので
コンパイルがはやーくなるらしい
元ネタ「http://d.hatena.ne.jp/melpon/20101022/1287705842」

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]