c++ - 如何实现两个类自动判定深拷贝和浅拷贝?

标签 c++ polymorphism deep-copy shallow-copy

我有以下设计问题:
我有一个带有两种访问器的 Resource:

  • 一个是修改它(我们称它为Access)
  • 一个用于类似 const 的访问(我们称之为 Const_access),但您可以说 c1=c2 然后 c1 将访问 c2。

鉴于Resource很大,我必须实现以下复制机制:

Access->Access:             deep copy
Access->Const_access:       deep copy
Const_access->Access:       deep copy
Const_access->Const_access: shallow copy

我的目标是编写 Access 以便 Const_access 能够准确使用 Access 中的 const 函数. 我当前的实现有缺陷,使用:

class Access {
  public:
  Access(const Access&); // deep copy
  void method(const Access&); 
  void const_method() const; 
  protected: 
  Resource res;
};
class Const_access : public Access{
  private:
  void method(); // only declaration
  public:
  Const_access(const Const_accesss&); // shallow copy
  explicit Const_access(const Access&); // deep copy
};

但是这里 Const_access ca; ca.Access::method() 仍然有效,我必须手动隐藏非常量访问器。我尝试过 protected 或私有(private)继承,但这也限制了 Access& 处理 Const_Access& 的灵 active 。

这个问题的正确解决方案是什么?

最佳答案

你说的是矛盾的。

一方面,您想禁止以下内容:

Const_access foo;
foo.modify();

但另一方面,您确实希望允许这样的事情:

void bar(Access& a) {
    a.modify();
}

Const_access foo;
bar(foo);

这没有意义。

一个更符合逻辑的关系是把继承结构反过来:

class Const_access {
public:
    Const_access(const Const_access&); // shallow copy
    void const_method() const;
protected:
    Resource res; // or perhaps a reference-counted pointer?
};

class Access: public Const_access {
public:
    Access(const Access&); // deep copy
    explicit Access(const Const_access&); // deep copy
    void method();
};

唯一没有提供的是将 Access 转换为 Const_access 时的深拷贝。

关于c++ - 如何实现两个类自动判定深拷贝和浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343646/

相关文章:

c++ - 传递对指针的引用

c++ - RapidXml 无法解析包含 unicode 的 xml

Java - 避免静态函数的 switch 语句

java - 虫洞攻击实现-传感器

c++ - 将 for_each 调用的函数放在类中的什么位置?

java - Spring-Data-Neo4J 类多态性

oop - UML 中的多态性和泛化

object - 带有 Ext JS 的 jQuery 深拷贝?

c++ - 使用 std::copy 而不是手动 for 循环复制动态数组有什么好处?

java - 如何在 Java 中制作 ArrayList<Integer> 的深层复制?