1

データの保存に使用するオブジェクトを作成し、読み取り/書き込みアクセスを制限したいと考えています。

例えば ​​:

OBJ obj1;
OBJ obj2;

// DataOBJ has 2 methods : read() and write()
DataOBJ dataOBJ1 (obj1);

obj1上記のコードでは、メソッドにアクセスしたいのですがwrite()、他のOBJオブジェクト (obj2この場合) はメソッドにのみアクセスする必要がありますread()

DataOBJそのような権利を制限するクラスを作成することは可能ですか?

古典的な「ゲッターセッター」は私のニーズには合いません。

ありがとう。

4

4 に答える 4

0

次の例のように、テンプレート グローバル参照 obj1/obj2 によって書き込み/読み取りへのアクセスを制御できます。

class OBJ {
};

OBJ obj1;
OBJ obj2;

// RESTRICTED ACCESS
class DataOBJBase {
protected:
   void write() {}
   void read() {}
};

template <OBJ&>
class DataOBJ;

// ALLOW WRITE IF FOR obj1
template <>
class DataOBJ<obj1> : public DataOBJBase {
public:
   using DataOBJBase::write;
};

// ALLOW READ IF FOR obj2
template <>
class DataOBJ<obj2> : public DataOBJBase {
public:
   using DataOBJBase::read;
};


int main() {
   DataOBJ<obj1> dobj1;
   dobj1.write(); // cannot read
   DataOBJ<obj2> dobj2;
   dobj2.read(); // cannot write
}
于 2012-10-15T11:09:40.520 に答える
0

あなたの最善の策は、readandメソッドのインターフェイスを定義し、実際のオブジェクトではなくwrite、読み取り専用のラッパー オブジェクト (例外をスローして実装する) を渡すことだと思います。write

これは、悪意のあるコードがラッパー オブジェクトを分析するのを止めるものではないことにDataOBJ注意してください。そうしたい場合は、読み取り専用クライアントとは別のプロセスに存在する必要があり、プロセス境界の RPC メカニズムでアクセスを強制する必要があります。許可。

于 2012-10-15T10:51:50.217 に答える
0

「無効な」メソッドが例外をスローして、さまざまなクラスのセットでそれを行うことができます。

何かのようなもの:

struct DataInterface
{
    virtual void read(...) = 0;
    virtual void write(...) = 0;
};

struct DataReadOnly : public DataInterface
{
    void read(...) { ... }
    void write(...) { throw write_not_allowed(); }
};

struct DataReadWrite : public DataInterface
{
    void read(...) { ... }
    void write(...) { ... }
};
于 2012-10-15T10:52:33.937 に答える
0

私が持っている考えは、おそらく悪い習慣です。それにもかかわらず、頭に浮かんだ何かで尋ねられたので、私は質問に答えます:

静的変数。

class Foo
{
    private:

      int y;
    public:
     Foo();
     ~Foo();
     void set(int);
     int get(void);
};

Foo::Foo()
{
   static int c = 0;
   ++c;

   y = c;
}

Foo::~Foo()
{
    --y;
}

int Foo::get(void )
{
  if(y == 1)
    return y;
  else
    //do return an error code or something
}

void Foo::set(int r)
{
  if(y== 2)
   y = r;
  else
   //Do nothing
}

int main()
{
    Foo *x1 = new Foo(); //Gets assigned 1
    Foo *x2 = new Foo(); //Gets assigned 2


    return 0;
}

編集:明確にするために-削除を省略しましたが、OPのコーディングではなく、私の答えがそこにあるアイデアをハッシュしているため、破壊を適切に減少させるためのロジックと同様にそうではありません。

于 2012-10-15T10:53:31.127 に答える