c++类中更多结构的复制构造函数

Copy constructor for more structures in class C++

本文关键字:复制 构造函数 结构 c++      更新时间:2023-10-16

我在做人们注册的程序。

我有类注册:

int personCount
int personSize
Person ** persons

Struct人

char * name
char * surname
Places ** oldPlaces // here is former residence of this person

和struct oldPlaces

char date[11]
char * street
char * city

在每个类/结构中,我都有分配空内存的构造函数和添加人或位置的add方法。

问题是如何实现复制构造函数?

我为注册设置了这个

CRegister::CRegister(const CRegister& b):personCount(b.personCount), personSize(b.personSize){
 persons = new Person*[b.personSize];
 personCount = 0;
 personSize = b.personSize;
 for (int i = 0; i < personSize; i++){
     persons[i] = new Person();
     persons[i].addPerson(b.persons[i]->id, b.persons[i]->name, b.persons[i]->surname);
 }

但是我想复制oldPlaces…

谢谢你的建议

您还应该为Person创建一个复制构造函数,并将其用于数组中的每个人。

for (int i = 0; i < personSize; i++)
    persons[i] = new Person(*b.persons[i]);

并复制其中的位置:

Person::Person(const Person &b) {
    ...
    // (Note that you will have to do a deep copy for the strings here as well)
    oldPlaces = new Places *[oldPlacesCount];
    for (int i = 0; i < oldPlacesCount; i++)
        oldPlaces[i] = new Places(*b.oldPlaces[i]);
}

然后可能还为Places等创建一个复制构造函数

编辑:是的,你需要添加oldPlacesCount

首先,如果使用的话,问题或多或少会自行解决std::stringstd::vector。如果你坚持使用指针,你必须自己做一个深度拷贝赋值函数和析构函数)。在每个对象中,你都必须访问所有指针,"克隆"子对象。您必须处理分配失败的情况可以将类型为PersonPlaces的对象留在不一致的状态。要做到这一点需要大量的代码,以及高度的c++专业知识。你不会想这么做的路线。(编写一个c++类,它有两个指向动态分配的内存可能非常复杂。使用shared_ptrscoped_ptr使它简单得多,但仍然不像使用vectorstring那么简单。)

编辑:

为了清楚地说明所涉及的内容,这里是需要的内容Place,如果你不使用标准库:

struct Place
{
    char date[11];
    char* street;
    char* city;
    Place()
        : street( NULL )
        , city( NULL )
    {
        memset( date, '', sizeof( date ) );
    }
    Place( Place const& other )
        : street( NULL )
        , city( NULL )
    {
        memcpy( date, other.date, sizeof( date ) )
        try {
            street = new char[ strlen( other.street ) + 1 ];
            strcpy( street, other.street );
            city = new char[ strlen( other.city ) + 1 ];
            strcpy( city, other.city );
        } catch ( ... ) {
            delete [] street;
            delete [] city;
            throw;
        }
    }
    Place& operator=( Place const& other )
    {
        Place tmp( other );
        memcpy( date, other.date, sizeof( date ) );
        std::swap( street, other.street );
        std::swap( city, other.city );
        return *this;
    }
    ~Place()
    {
        delete [] street;
        delete [] city;
    }
};

Person更复杂,因为你必须这样做将整个数组oldPlaces初始化为NULL,然后初始化为复制到一个try块中,如果有任何错误,删除它们。

在实践中,任何有c++经验的人的第一件事如果由于某种原因他或她不能使用标准,他会怎么做库中,将实现一个(可能是简化的)版本std::stringstd::vector,并使用它们。试块就像上面的复制构造函数一样,通常是一个指示程序员并不真正理解c++。所有像上面这样的代码中的分配和释放将被包装在一个更小、更原始的类,每个类最多只能管理一个动态分配的资源。因此,即使在保持非常跟你写的差不多,可能会有一个一个StringPtr类,并在Person中使用它等。同样的,可以使用一个Person数组和一个Place数组,而不是指针数组。

我不知道你的结构被强加到什么程度你的老师,但这是不是在c++中编程的方式