2012-01-25 5 views
4

DLLからオブジェクトにアクセスし、そのオブジェクトに対して何らかの操作を行い、そのオブジェクトを別の関数に渡す必要があります。問題は私が変更する必要があるフィールドはプライベートです。クラス内のプライベートメンバーにアクセスする

元のクラスのフィールドのプライベート修飾子を変更したくないのは、クラスが古くから書かれていて、多くの場所で使用されているからです。しかし、私がクラスを操作している場所では、保護なしでほとんどのフィールドが必要です(ハックです)。それを行う最善の方法は何ですか?

注:私はそれを行うには、元のクラス

+0

ポインタを使用してください。 –

+0

「それはハックですか?」とはどういう意味ですか?あなたがこれを記述しているようにすると、プライベートフィールドを外部的に変更したい場合、これが完全に間違っているように思えます。 – templatetypedef

+0

[Burt BacharachとCarole Bayer Sager](http://en.wikipedia.org/wiki/That's_What_Friends_Are_For):[これは、友人のためのものです](http://www.parashift.com/ C++ - faq-lite/friends.html)。 –

答えて

1

あなたは同じビットパターンでモッククラスを作成し、

オリジナルクラス下のモッククラスオブジェクトに元のオブジェクトをキャストすることができ、元のクラスを参照してくださいすることができた場合は

class ClassWithHiddenVariables 
{ 
private: 
    int a; 
    double m; 

}; 

モッククラス

class ExposeAnotherClass 
    { 
    public: 
     int a_exposed; 
     double m_exposed; 
    }; 

あなたはメンバーを見てみたいですClassWithHiddenVariablesオブジェクトのreinterpret_castを使用してExoseAnotherClassにキャストします。

ClassWithHiddenVariables obj; 
    obj.SetVariables(10, 20.02);  
    ExposeAnotherClass *ptrExposedClass; 
    ptrExposedClass = reinterpret_cast<ExposeAnotherClass*>(&obj); 
    cout<<ptrExposedClass->a_exposed<<"\n"<<ptrExposedClass->m_exposed; 
+0

は、両方のクラスが同じであることが保証されているビットパターンです –

+1

あなたは同じコンパイラと設定を使用することを前提としています。クラスにパブリック変数があるかどうかをチェックすることができます。元のオブジェクトのパブリックメンバーが対応するモックオブジェクトメンバーと等しいかどうかを確認するだけです。 – Jimmy

1

一つの方法を変更することはできません午前:DLLにコンパイルされてどのようなゲッター/セッターは

+2

これは何も隠していません。それは単に他の方法でそれらを公開しているだけです。 –

+1

OPはフィールドを操作したいと言った。 –

+0

@ jisaak - 元のクラスを変更することはできません。 –

3

を機能書くには重要なもの、この場合には、本当に重要ではありませんあなたがインクルードするのヘッダファイルです。興味のあるクラスのヘッダファイルを変更して、必要な変数がpublicになるようにすることをお勧めします。

メンバーアクセスはリンカーではなくコンパイラによってチェックされるため、クラスの宣言方法が重要です。これはではありません。では、DLLを再コンパイルしたり、クラスの実装を変更したりするだけで、ヘッダーファイル(またはヘッダーファイルのコピー)を変更する必要があります。

+0

OPがハッキングを望んでおり、デバッグの日や数週間を処理する用意ができていることは必然的に起こります。これは最高のハックのようです。 –

+0

Thaベストハックエヴァー! –

+1

+1、私はそれが好きですが、1つの懸念は、これが将来のコードを調べる誰にも引き起こす混乱の量です。 –

0

「Forger」ハック例外的なC++スタイルのアイテム15が動作します。しかし、それは1つの定義ルールに違反するので違法ですので、私はこれを生産コードで行うことを勧めません。

クラスXのプライベートメンバー "がprivate_は" ハイジャックでアクセス可能であるか注意

// Example 15-1: Lies and Forgery 
// 
class X { 
    // instead of including x.h, manually (and illegally) duplicates X's 
    // definition, and adds a line such as: 
    friend ::Hijack(X&); 
}; 

void Hijack(X& x) { 
    x.private_ = 2; 
} 
ページから。

関連する問題