我有以下设计问题:
我有一个带有两种访问器的 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/