gpt4 book ai didi

c++ - 如何为具有指针 vector 的类创建复制函数?

转载 作者:行者123 更新时间:2023-11-30 05:11:53 26 4
gpt4 key购买 nike

我有一个类,Somec,带有指向项目的指针 vector 。 vector 中的每个项目都来自另一个类类型,Myitem

我想为 Somec 制作一个复制功能,但我遇到了一些问题。

另外,我有一个Myitem的复制功能,我是否必须在Somec的复制功能中使用它?

到目前为止我尝试了什么:

class Somec {
string Name;
std::vector<Myitem*> Items;

public:
Somec(const Somec& somec); // my copy function
};

/// this the clas to my item :
class Myitem {
Itemk itemk;
public:
// ... some fuction
};

// now I want to make a copy function for Somec

Somec::Somec(const Somec& somec) {
int size = somec.Items.size();
this->Items = new (vector*) (size); // i get an error here
this->Name = somec.Name;
for(int i = 0; i < size; i++) {
*Items.at(i) = *somec.Items.at(i);
}
}

更新:我按照 Remy Lebeau 告诉我的那样制作了复制功能,但是当我尝试测试此功能时,代码停止工作。这就是我测试它的方式:

class Somec {
string Name;
std::vector<Myitem*> Items;

public:
Somec(const Somec& somec); // my copy function
};

Somec::Somec(const Somec& somec) { // new copy function for somec
int size = somec.Items.size();
this->Name = somec.Name;
for(int i = 0; i < size; i++) {
Items.push_back(new Myitem(*somec.Items[i]));
}
}

// create item function
void Somec::createitem(char* name, const int& Time, const int& level) {
try{
Myitem* ORitem=new Myitem(name, Time, level);
Somec::Items.push_back(ORitem);
}
catch(MemoryProblemException& error) {
throw SomecMemoryProblemException();
}
}

std::vector<Myitem*> Somec::getAllItems() const {
return Items;
}

/// this the class to my item :
class Myitem {
Itemk itemk;
public:
// ... some fuction
};

// my copy function to MYitem
Myitem::Myitem(const Myitem& item){
Myitem* currie = Myitem::clone_item();
curritem->item = itemCopy(item.item);
if (!curritem->item) {
throw itemMemoryProblemException();
return;
}
}

void testCopy() {
Somec somec("name1")
somec.createitem((char*) "item1", 30, 1, 2);
Somec temp(somec);
int x=0;
if ( std::equal(somec.getAllItems().begin() + 1, somec.getAllItems().end(), somec.getAllItems().begin()) ) {
x++;
}
ASSERT_TRUE(x==1);
}

我的问题是什么?我的意思是,我做了复制功能,我认为这是真的。但为什么代码停止工作?我是否以正确的方式进行测试?

我的 createitem 函数,实际上我对此有 100% 的把握。

我只是想将项目添加到 Somec 中的 vector 并检查这是否正确发生。我了解到在 C++ 中,我们需要一个复制构造函数,所以我写了一个,并考虑测试它,因为这是我第一次这样做。

最佳答案

如果你想在复制构造函数中将元素从另一个实例的 vector 复制到你当前实例的 vector ,那么只需这样做

class Somec {
string Name;
std::vector<Myitem> Items;
public:
Somec(const Somec& somec); // my copy function
};

即制作值 vector 而不是指针。

如果出于某种原因你必须使用指针,因为复制构造函数可能被删除或类似的东西。然后还是用这种方式,只是不要复制拷贝构造函数中的内容,让它们构造出来然后赋值

Somec(const Somec& somec) {
this->Items.resize(somec.Items.resize());
for (std::size_t i = 0; i < somec.Items.size(); ++i) {
this->Items[i] = somec.Items[i];
}
// or simply
this->Items = somec.Items;
}

关于c++ - 如何为具有指针 vector 的类创建复制函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44831510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com