0

約 100 の方程式を解くコードを開発しています。これらの方程式のほとんどは、最終的にユーザーがそれらを気にしないため、プライベート メンバーで計算されます。しかし、今私はそうします。そのため、コードを開発するときに、プライベート メンバーをすばやくテストする方法が必要です。

以下のコードは、私が望む基本的な動作を提供しますが、機能しません (プライバシーの問題)。この動作が可能であれば、助けていただければ幸いです。

// Includes
#include <stdio.h>

// I want a general test class that can access private members
template <class Name> class TestClass{
    public:
        TestClass(Name& input) : the_class(input){}
        Name& operator()(){ return the_class; }
        Name& the_class;
};

// The class I want to test
class ClassA{
    public:
        friend class TestClass<ClassA>; // I hoped this would do it, but it doesn't
        ClassA(){}              
    private:
        void priv(){ printf("a private function\n"); }
};


// Main function that preforms the testing
int main (){
    ClassA a;
    TestClass<ClassA> b(a);
    b().priv(); // I want to do this
}
4

2 に答える 2

1

あなたは に友情を与えましたが、その友情を代わりにTestClass<ClassA>主張しています。main()

選択肢は次のとおりです。

  • TestClass<>を呼び出す転送関数を記述します。the_class.priv()
  • 実際にそれを必要とする機能に友情を与えます。(これは実際のプログラムには実際 main()にはないと思います。)
于 2012-07-13T18:30:23.377 に答える
1

これにはさまざまなアプローチがあります。高レベルの観点から、TestClassテスト対象の型に存在するものと同じ機能をアダプターに提供し、要求を転送させることができます。もう 1 つのオプションは、メンバー関数で実際にテストを実行するテスト クラスと友達になることです。


以下のコードはコンパイルされません。取るべきアプローチを示していますが、詳細はオフです。詳細については、Kerrek がコメントでリンクした記事をお読みください。


最後に、C++ fu を悪用したい場合は、明示的なテンプレートのインスタンス化とメンバー ポインターを使用して、アクセス指定子を壊すことができます (これは頭の中で書いていますが、コンパイルされない可能性がありますが、アイデアはそこにあります...コンパイラエラーが発生した場合は、それと戦うだけです):

template <typename T, void (T::*Ptr)() >
struct accessor {
   typedef void (T::*ptr_t)();
   static ptr_t ptr;
};
template <typename T, void (T::*Ptr)() >
accessor<T,Ptr>::ptr_t accessor<T,Ptr>::ptr = Ptr;

template accessor<ClassA, &ClassA::priv>;
typedef accessor<ClassA, &ClassA> priv_accessor;
int main() {
   ClassA a;
   (a.*priv_accessor::ptr)();
}

ここでのアプローチでは、テンプレートのインスタンス化を使用してアクセスを中断します。これは、テンプレートの明示的なインスタンス化への引数がアクセスをチェックしないためです (明示的なテンプレートのインスタンス化は名前空間レベルで発生する必要があるため、それ以外の場合、プライベート メンバーを使用してそのテンプレートをインスタンス化することは不可能です)。名前空間とフレンドになることはできません)

于 2012-07-13T18:38:48.983 に答える