1

我想创建一个用于存储数据的对象,限制读/写访问。

例如 :

OBJ obj1;
OBJ obj2;

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

使用上面的代码,我想obj1访问write()方法,而其他OBJ对象(obj2在这种情况下)应该访问该read()方法。

是否可以创建一个DataOBJ像这样限制权利的类?

经典的“getter setter”不适合我的需要。

谢谢。

4

4 回答 4

0

我认为您最好的选择是为readandwrite方法定义一个接口,并将一个只读包装对象(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 回答
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 回答