#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的指针和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
主函数实例化了两个对象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.) 复制构造函数与实际问题有什么关系?实现复制构造函数如何解决问题?
push_back
的第二个重载中,您正在存储指向参数的本地副本的指针,因此在 push_back 结束后,该指针无效。 - Manu343726