メンバ関数の分割

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
参照魚
記事: 109
登録日時: 6年前

メンバ関数の分割

#1

投稿記事 by 参照魚 » 2年前

長いメンバ関数を分割したい場合、分割した関数をクラスのヘッダに記述しなければなりません。

コード:

// test.hpp
class TEST {
public:
    void func();
};

// test.cpp
void TEST::func(){
// 長い関数
}
↓funcを内部的に分割する

コード:

// test.hpp
class TEST {
public:
    void func();
private:
    void funcA();
    void funcB();
    void funcC();
};

// test.cpp
void TEST::funcA(){}
void TEST::funcB(){}
void TEST::funcC(){}

void TEST::func(){
    funcA();
    funcB();
    funcC();
}
funcA,funcB,funcCはtest.cppでしか使用しないとした場合、test.hppに宣言しないで済ませる方法はありますでしょうか?ファイルローカルなのにいちいちヘッダに書くのが面倒くさいのと存在そのものを隠蔽したいという気持ちがあります。

意味的には下記のラムダ式のような感じですが、関数内で定義するためインデントが深くなりあまり好きではありません。

コード:

void TEST::func(){
    auto funcA = [&]{};
    auto funcB = [&]{};
    auto funcC = [&]{};

    funcA();
    funcB();
    funcC();
}
また、これの欠点は下記のとおりです。

①先に定義したfuncAからは後に定義したfuncBやfuncCを呼べない
②publicのfunc2()やfunc3()をtest.cppに新設した場合に共有で使えない

言語仕様上無理かなとも思ってますが何か方法があれば。
なおマクロ(define)は避けたいです。

ロマネスコ

Re: メンバ関数の分割

#2

投稿記事 by ロマネスコ » 2年前

こういうのはどうでしょうか?
► スポイラーを表示
実行結果→https://wandbox.org/permlink/BYI9uQQs78boxbSs

参照魚
記事: 109
登録日時: 6年前

Re: メンバ関数の分割

#3

投稿記事 by 参照魚 » 2年前

ありがとうございます。分割した関数群でもTESTのメンバ変数を参照するため、メンバ関数である必要がありますため、提示いただいたコードではできないのです。

ロマネスコ

Re: メンバ関数の分割

#4

投稿記事 by ロマネスコ » 2年前

なるほど。厳しいですね。
friend関数等も考えましたが、結局宣言しないといけませんし、なかなかご期待に添えませんね…。
まあ、なんのためのprivateなのかを考えると仕方ないのかな、と。
オフトピック
こんな方法を考えてみました。半分ネタです。
・データメンバをtest.cpp内でグローバル変数としてしまう。
一気にC言語っぽくなりますが、test.cpp内の各関数で使用できます。
先に提案した方法と同時に使えば、データメンバすらヘッダファイルに書かなくて済むので、よりスッキリするのではないでしょうか。
デメリットは、コンストラクタで変数の初期化をするときにメンバ初期化子リストが使えなくなることですかね。

返信

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