[c++]PImplイディオムのcppファイル分割

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
purin52002
記事: 235
登録日時: 8年前
連絡を取る:

[c++]PImplイディオムのcppファイル分割

#1

投稿記事 by purin52002 » 8年前

おはようございます。今日はPImpleイディオムについて質問があります。

このようなクラスを考えます。

コード:

class Aho
{
public:
    int x;
};

class MyClass
{
private:
    Aho aho;

public:
    int funcA(){return aho.x+1;}
    int funcB(){return aho.x+2;}
};
このクラスをヘッダとソースファイルに分割して、

コード:

//------------Aho.h
class Aho
{
public:
    int x;
};

//--------------------MyClass.h
#include"Aho.h"
class MyClass
{
private:
    Aho aho;

public:
    int funcA();
    int funcB();
}

//-----------A.cpp
#include"MyClass.h"
int MyClass::FuncA(){return aho.x+1;}

//-------------------B.cpp
#include"MyClass.h"
int MyClass::FuncB(){return aho.x+2;}
このコードにPImplイディオムを適用させたいです。

コード:

class MyClass
{
private:
    class Impl;//中身はpublicのAho
    Impl *pimpl;

public:
    int funcA();
    int funcB();
}
しかしソースが2つあるため片方のソースだけでInplを定義すると、もう片方のソースではInplが不完全な型になってしまいます。
しかし、両方のソースでImplを定義するのは多重定義になりそうだし、そもそも同じコードを二回も書くのが個人的に気にくわないです^^;

そこで、今回の質問ですが、
  • PImplイディオムを使う場合、クラスの定義を複数のソースファイルに分割することは可能か?
  • 可能だとしたら、Implクラスの定義を一つにまとめることは可能か?
以上の2つになります。

よろしくお願いします<(_ _)>
オフトピック
プログラムの質問とは全く関係ないのですが
  • 特定の方に返信したいとき
  • BBCode中でタブインデントを使いたいとき
  • BBCode中で水平線を使いたいとき
はどのように書けばいいのでしょう?
プログラムと関係なくて申し訳ないです^^;
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: [c++]PImplイディオムのcppファイル分割

#2

投稿記事 by usao » 8年前

普通に,クラス MyClass::Impl を宣言するヘッダを用意し,
MyClass::Implのメンバ関数の実装を記述するcpp群でそれをincludeすればいいのではないでしょうか.

アバター
purin52002
記事: 235
登録日時: 8年前
連絡を取る:

Re: [c++]PImplイディオムのcppファイル分割

#3

投稿記事 by purin52002 » 8年前

usaoさん
なぜこんな単純な方法に気づかなかったのか^^;
おかげで解決です!
、、、と言いたいところなんですが、ヘッダでクラスの宣言をするということは

コード:

//Impl.h
#include"Aho.h"
#include"MyClass.h"

class MyClass::Impl
{
public:
    Aho aho;
    void func_aho();
};
ということですよね?

これではImpl.hをインクルードしてMyClass::Impl::とかけばインテリジェンス君がメンバを見せてくれます。(もちろんアクセスはできない。)
これは隠ぺい出来てるといえるのでしょうか?

ちなみに、今回のPimplイディオムは隠ぺい目的ではなくヘッダの依存関係を少なくすることが目的でしたので、これで解決にしたいと思います。

↑のは質問ではなく疑問と受け取ってください^^;

ありがとうございました。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: [c++]PImplイディオムのcppファイル分割

#4

投稿記事 by usao » 8年前

>これではImpl.hをインクルードしてMyClass::Impl::とかけば…

これを避けたいのであれば,libにするとかして,物理的に利用側にImpl.hを渡さなければよいかと.
オフトピック
利用側が #include "Impl.h" って書くことができてしまう状況(MyClassの実装コード一式を利用側に渡す状況)下においては
「利用側に公開するヘッダはMyClass.hだけですぜ」っていう話は,紳士協定的な何か(?)と考えてよいのではないかなぁ.

アバター
purin52002
記事: 235
登録日時: 8年前
連絡を取る:

Re: [c++]PImplイディオムのcppファイル分割

#5

投稿記事 by purin52002 » 8年前

なるほどですね。
ライブラリの作り方は最近覚えたばっかだったので丁度よかったです。

これで完全解決です^^
ありがとうございました。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

閉鎖

“C言語何でも質問掲示板” へ戻る