0

私のデザインには、データの一部を互いに共有する 2 つのレイヤーが含まれています。

下位層は、構造体にいくつかのデータを保持します。

struct Abc {
    int a;
    int b;
    int c;
};

残りのフィールドへのアクセスを許可せずbに、構造のフィールドを上位レイヤーにエクスポートする必要があります。Abcフィールドと同じメモリ位置にある上位層に新しい変数 (実際にはエイリアス) を作成したいと思いbます。このようにして、両方のレイヤーが同じ変数を共有します。

構造を公開せずにこれを行う方法はありますか?

4

3 に答える 3

0

この種のアクセス制御は、C++で直接実行できます。Cでは実行できません。アクセスするはずのないメンバーにアクセスしないという規律を使用する必要があります。

部分的な代替手段があります。プライベート構造を不透明なポインターにし、データを取得する方法を知っている関数を使用することができbます。その場合、上位層のコードは下位層のデータ構造の内部を見る必要はありません。

upper.h

#include "lower.h"

struct Upper
{
    int p;
    struct Lower *q;
    int r;
};

lower.h

struct Lower *lower_new(void);
void lower_free(struct Lower *);
int lower_b(struct Lower *q);

b上位構造のインスタンスで下位構造のフィールドを必要とするコードは、次のuように記述します。

struct Upper u = { ... };
int x = lower_b(u.q);

そのスキームをあなたのために働くものに変える方法はたくさんあります。下位構造のパブリックヘッダーは、構造の内容をまったく定義していないことに注意してください。これは、ソースコードに隠された実装の詳細です—<code>lower.cおそらく。

于 2012-09-07T06:57:03.747 に答える
0

structここでレイヤーが何を意味するのか正確にはわかりませんが、1 つのファイルにプライベートなa のメンバーの 1 つにアクセスする必要があると想定しています。

その場合、単にextern「peek」関数を記述して、モジュールの他のファイルに公開したい特定の構造変数の値を返すことができます。これにより、その 1 つの要素の値にアクセスできるようにしながら、構造の残りの部分のスコープが保護されます。

于 2012-09-07T06:51:10.897 に答える
0

最も簡単な方法は次のとおりです。

struct Public
{
    int a;
};

struct Private
{
    struct Public p;
    int b;
    int c;
};

また、構造体へのポインターをその構造体の最初のメンバーの型にキャストできるという C の機能に依存し、その逆も可能です。

構造体にメンバーが 1 つしか含まれていない場合は、おそらくPublic構造体なしで行うことができます。

于 2012-09-07T06:43:14.353 に答える