1. ホーム
  2. c++

フレンドを利用せずに、クラス外からプライベートメンバーにアクセスすることはできますか?

2023-08-13 10:45:18

質問

免責事項

私が質問していることがまったく馬鹿げていること、そしてプロダクションコードでそのようなことを試したいと思う人は、解雇されるか撃たれるべきであることは、十分に承知しています。 私が主に見ているのは ができるかどうかを見ています。

さて、それはそれとして、C++でクラスの外からクラスのプライベートメンバにアクセスする方法はあるのでしょうか? 例えば、ポインタのオフセットでこれを行う方法はあるのでしょうか?

(素朴な、あるいは生産に適さないようなテクニックも歓迎します)

更新情報

コメントにあるように、私は過剰なカプセル化 (およびそれが TDD にどのように影響するか) についてのブログ記事を書きたかったので、この質問をしました。 最終的に、なぜそれが問題なのかよりも、どのように問題を解決するかに焦点を当てることにしました。

ともかく、どのようになったのかに興味がある人がいれば、ここに書いておきます。 テスト駆動開発の敵 パート I: カプセル化 (私がおかしいと判断する前に、読むことをお勧めします)。

どのように解決するのか?

もしクラスにテンプレートのメンバ関数があれば、そのメンバ関数を自分のニーズに合わせて特別化することができます。たとえ、元の開発者がそれを考えなかったとしてもです。

safe.h

class safe
{
    int money;

public:
    safe()
     : money(1000000)
    {
    }

    template <typename T>
    void backdoor()
    {
        // Do some stuff.
    }
};

main.cppです。

#include <safe.h>
#include <iostream>

class key;

template <>
void safe::backdoor<key>()
{
    // My specialization.
    money -= 100000;
    std::cout << money << "\n";
}

int main()
{
    safe s;
    s.backdoor<key>();
    s.backdoor<key>();
}

出力します。

900000
800000