【问题标题】:Specific "getter setter" dedicated object具体的“getter setter”专用对象
【发布时间】:2012-10-05 07:51:52
【问题描述】:

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

例如:

OBJ obj1;
OBJ obj2;

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

使用上面的代码,我希望obj1 访问write() 方法,而其他OBJ 对象(在本例中为obj2)应该 访问read() 方法。

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

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

谢谢。

【问题讨论】:

  • 这应该取决于什么?变量的名称?
  • @LuchianGrigore 没有办法吗?律师/客户成语+朋友关键字的组合? ^^
  • 你能整理一下你的例子吗?现在看起来DataOBJ 是一个函数,不太清楚你的意思。
  • obj1、obj2是全局对象吗?
  • @PiotrNycz 他们不是,但可以。

标签: c++ getter-setter rights


【解决方案1】:

您可以通过模板全局引用 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
}

【讨论】:

  • 使用这种方法,我必须为每个OBJ 指定读取或写入访问权限。有没有办法“自动化”呢?如果DataOBJ&lt;obj1&gt;,那么obj1 是唯一具有写入权限的OBJ
  • 是的,通过这种方式,您必须为每个对象执行此操作。
  • 你的对象可以是不同的类型吗?我的意思是ObjWithReadAccessToData obj1;ObjWithWriteAccessToData obj2;?两者都来自 Obj:class ObjWithReadAccessToData : public Obj?
  • 不,他们不能。看看这个案例:DataOBJ dataOBJ1 (obj1); DataOBJ dataOBJ2 (obj2);。这里obj1可以写入dataOBJ1obj2可以写入dataOBJ2,都可以读取两个dataOBJ。
  • 更新您的问题 - 显示应编译的行和不应编译的行的确切示例。我的意思是展示这种读/写访问的用法 - 也许我以某种方式误解了你的问题
【解决方案2】:

我有一个想法并且可能是不好的做法。不过,我会用想到的东西来回答这个问题:

静态变量。

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 编码。

【讨论】:

    【解决方案3】:

    您可以使用一组不同的类来做到这一点,“禁用”方法会引发异常。

    类似:

    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(...) { ... }
    };
    

    【讨论】:

    • 如何在我的OBJ 对象中使用这些结构?
    • @Patouf 对此我无能为力,因为我不知道你想用readwrite 函数做什么。我只是展示了一种不允许某些操作的类的一般方法。
    • DataOBJ 是一个模板类template &lt;typename mydata&gt;,有一个私有属性mydata mydata_write(mydata&amp; data) 将数据设置为mydata_,而read(mydata&amp; data) 检索mydata_ 的值。
    【解决方案4】:

    我认为你最好的选择是为readwrite 方法定义一个接口,并传递一个只读包装对象(通过抛出异常实现write)而不是真正的对象给任何人不应获得写权限。

    请注意,这并不能阻止恶意代码剖析您的包装器对象——如果您想这样做,DataOBJ 应该与只读客户端存在于不同的进程中,并且该进程中的 RPC 机制边界需要强制访问权限。

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2019-05-14
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多