1

例えば、

Class Test {
        private:
            int x;
        public:
            int y;
}obj;

現在、obj.y にはアクセスできますが、obj.x にはアクセスできません。

私の質問は、コンパイラがプライベート データへのアクセスをどのように制限するかです。

また、C 構造体にアクセス指定子を実装するにはどうすればよいですか?

4

2 に答える 2

1

私の質問は、コンパイラがプライベート データへのアクセスをどのように制限するかです。

ソース コードが任意の変数を参照する場合、C++ コンパイラは変数 (ローカル変数、メンバー変数、グローバル変数など) を見つけるために名前検索を実行する必要があり、アクセス チェックを実行する必要があります。コンパイラは、型、変数、およびスコープに関するすべての情報を持っているため、ソース コードが変数を参照するとき、コンパイラはその変数にアクセスできるかどうかを認識します。変数にアクセスできない場合、コンパイラはソース コードを拒否します。

「どのように」と尋ねても、実際には賢明な答えはありません。それはコンパイラであり、それが何をするかです。プログラムのソースコードでできることは、コンパイラが行うこととはまったく異なるため、同じことを行うために C コードを記述しようとしている場合、それがどのように行われるかを知っていても役に立ちません。それは、飛行機がどのように飛ぶかを尋ねてから、車でどのように飛べるかを尋ねるようなものです. 一方に対する答えを知っていても、他方には関係ありません。

また、C 構造体にアクセス指定子を実装するにはどうすればよいですか?

2 つのオプション:

  1. C はそれをサポートしていません。C++ を使用してください

  2. 不透明な型を指す構造体にa を格納し、void*「プライベート」関数 (つまり、API の内部) のみがその不透明な型の詳細を認識します。

ここに簡単な例があります

//
// in header only "public" data is visible
//

struct Data {
    int some_number;
    void* private_data;
};

Data* create_Data(int i, int j);
void manipulate_Data(Data*);

//
// in source file, these functions know what the `void*` points to and can use it
//

struct InternalData {
    int another_number;
};

InternalData* get_internals(Data* d)
{
    return (InternalData*)d->private_data;
}

Data* create_Data(int i, int j)
{
    Data* data = (Data*)malloc(sizeof(Data));
    data->some_number = i;
    InternalData* internal = (InternalData*)malloc(sizeof(InternalData));
    internal->another_number = j;
    data->private_data = internal;
}

void manipulate_Data(Data* d)
{
    data->some_number += get_internals(d)->another_number;
}
于 2013-09-27T11:40:54.330 に答える