C++中的可复制数据类
copyable data class in C++
受本文启发,我有一个包含嵌套可复制数据类的类。此可复制类的成员类没有动态内存分配、保护或私有。
Class Domain
{
public:
// copyable class
struct CopyableDataClass
{
int i;
}
void method1(const CopyableDataClass& data){...}
void method2(const CopyableDataClass& data){...}
}
此外,通过阅读这个维基百科页面,我无法为"CopyableDataClass"本身使用动态内存分配,以避免像那样的浅层复制
Domain::CopyableDataClass* p1=new CopyableDataClass();
Domain::CopyableDataClass* p2;
p2=p1;
但是"域"类呢?它也很特别吗?例如,我可以按以下方式进行吗?
Class User
{
public:
Domain* getter();
void setter(const Domain* data);
private:
Domain* m_data; //pointer ok? private ok?
}
或者我必须把它像可复制类一样公开
Class User
{
public:
Domain m_data;
}
除了一般的类设计规则(封装等)之外,这个"域"类的使用是否有任何约束(保护/私有/动态内存分配)。我想这些约束只适用于"Copyable"类。我说得对吗?
感谢您的评论。
您的CopyableDataClass
就像一个值,类似于int
。动态分配它并没有什么好处,就像你通常不会用单个int
s那样。
如果Domain
类只包含"可复制数据",那么它将与其内容一样可复制。
您的用户类应该是这样的:
class user
{
public:
// we can't construct a domain-user without knowing it's domain
user(Domain* domain) : m_domain(domain) { }
// return the domain the user is part of
Domain& get_domain() { return *this->m_domain; }
private:
// you can't copy a domain-user
user(user const&);
user& operator=(user const&);
Domain* m_domain;
};
对于复制语义,我通常遵循以下规则:
1) 如果我的类是POD,我可以使用编译器生成的复制构造函数和赋值运算符。
2) 如果我想防止复制我的对象,我声明复制构造函数和赋值运算符是私有的,我不实现它们
3) 如果我的类不是POD,我将提供复制构造函数和赋值运算符的实现,它们提供对象的深层副本。当一个对象有const数据成员时,我会声明赋值运算符为private,而不实现它。
相关文章:
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 简单可复制与可简单复制
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 如何实现共享数据的复制构造函数
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 从网络数据包复制一串 wchar 时访问冲突
- 为什么 std::function 本身是可复制构造的类型?
- C++不可复制的 lambda 的行为是可复制的
- C++中的可复制数据类