C++中的可复制数据类

copyable data class in C++

本文关键字:数据 可复制 C++      更新时间:2023-10-16

受本文启发,我有一个包含嵌套可复制数据类的类。此可复制类的成员类没有动态内存分配、保护或私有。

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,而不实现它。