例えば、
Class Test {
private:
int x;
public:
int y;
}obj;
現在、obj.y にはアクセスできますが、obj.x にはアクセスできません。
私の質問は、コンパイラがプライベート データへのアクセスをどのように制限するかです。
また、C 構造体にアクセス指定子を実装するにはどうすればよいですか?
例えば、
Class Test {
private:
int x;
public:
int y;
}obj;
現在、obj.y にはアクセスできますが、obj.x にはアクセスできません。
私の質問は、コンパイラがプライベート データへのアクセスをどのように制限するかです。
また、C 構造体にアクセス指定子を実装するにはどうすればよいですか?
私の質問は、コンパイラがプライベート データへのアクセスをどのように制限するかです。
ソース コードが任意の変数を参照する場合、C++ コンパイラは変数 (ローカル変数、メンバー変数、グローバル変数など) を見つけるために名前検索を実行する必要があり、アクセス チェックを実行する必要があります。コンパイラは、型、変数、およびスコープに関するすべての情報を持っているため、ソース コードが変数を参照するとき、コンパイラはその変数にアクセスできるかどうかを認識します。変数にアクセスできない場合、コンパイラはソース コードを拒否します。
「どのように」と尋ねても、実際には賢明な答えはありません。それはコンパイラであり、それが何をするかです。プログラムのソースコードでできることは、コンパイラが行うこととはまったく異なるため、同じことを行うために C コードを記述しようとしている場合、それがどのように行われるかを知っていても役に立ちません。それは、飛行機がどのように飛ぶかを尋ねてから、車でどのように飛べるかを尋ねるようなものです. 一方に対する答えを知っていても、他方には関係ありません。
また、C 構造体にアクセス指定子を実装するにはどうすればよいですか?
2 つのオプション:
C はそれをサポートしていません。C++ を使用してください
不透明な型を指す構造体に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;
}