gpt4 book ai didi

c++ - 为什么需要这个拷贝构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:45:18 31 4
gpt4 key购买 nike

#include <iostream>
#include <vector>

using namespace std;

class A {
private:
int number;
public:
A() {number = 0;}
A(int nr) {number = nr;}
//A(const A& rhand) {this->number = rhand.number;}
int get_number() const {return this->number;}
A& operator=(const A& rhand) {
this->number = rhand.number;
return (*this);
}
};

class B {
private:
vector<A*>* content;
vector<A*>::iterator currA;
bool currA_valid;
public:
B() {
content = new vector<A*>;
currA = content->begin();
currA_valid = false;
}
void push_A(A* nA) {content->push_back(nA); currA_valid = false;}
void push_A(A nA) {content->push_back(&nA); currA_valid = false;}
A get_A() {
if(!currA_valid) {
currA = content->begin();
if(!content->empty()) {
currA_valid = true;
}
}
if(currA == content->end() || this->content->empty()) {
currA = content->begin();
return A();
}
else {
A result(**currA);
++currA;
return result;
}
}
};

int main()
{
B container;

A* a1 = new A(1);
cout << a1->get_number() << endl;
A a2(2);
cout << a2.get_number() << endl;

container.push_A(a1);
container.push_A(a2);


A tmp;
while((tmp = container.get_A()).get_number() != 0)
cout << "Inhalt tmp: " << tmp.get_number() << endl;

return 0;
}

最近我遇到了一个问题,我把它变成了这个代码片段。

本质上,B 类是 A 类对象的容器。

在实际代码中A要大很多,同一个A类型的对象可能会在容器中出现多次,所以为了节省空间,B只存放指向A的指针。

B::push 函数将 A 类型的对象送入容器。

它们为 A 的指针和值重载。

主函数末尾的 while 循环是我想要的(有点像流运算符与 iostream 对象一起使用)。

B 中的迭代器“currA”跟踪函数调用 B::get_A() 最后返回的元素,因此对该函数的连续调用返回 B::content 中的所有 A 对象,直到结束到达。在这种情况下,内部迭代器被重置,并返回一个带有内部无效标志的对象 A(在这种情况下为简单起见,A::number 为 0)。

这个程序的输出可能是这样的:

1
2
Inhalt tmp: 1 //content of a1
Inhalt tmp: 4620996 //content of a2

main函数实例化了两个对象A a1(1)和A* a2(2)。

测试 A::get_number() 显示的两个内部值。两者都按预期工作。但是在我们将它们都放入容器并再次从容器中取出它们之后,只有 a1 被正确显示。 a2 的内容只是一些随机数。

起初我以为,我在一些指针上犯了错误,但如果像这样声明和定义类 A 的复制构造函数,则证明问题已解决:

A(const A& rhand) {this->number = rhand.number;}

据我所知,如果没有提供复制构造函数,C++ 编译器将隐式定义复制构造函数,建议在类具有指针作为成员时实现它以避免浅拷贝。但在这种情况下,A 只有一个 int。

我还尝试通过摆脱 B::get_A() 并通过其他方式获取容器内容来简化代码。即使没有实现默认构造函数,问题也消失了。所以这是我的问题:

1.) 编译器定义的复制构造函数不是和我提供的类似吗?
还有
2.) 复制构造函数与实际问题有什么关系?实现复制构造函数如何解决问题?

最佳答案

void push_A(A nA) {content->push_back(&nA); currA_valid = false;}

在这里,您将按值获取 A 对象。该对象是函数的本地对象。当函数返回时,该对象不再存在,因此您的 vector 将留下一个无效指针。

您的复制构造函数的实现与解决问题无关,这只是一个巧合。

关于c++ - 为什么需要这个拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914556/

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