我的类中有一个向量数组,用于保存指向特定对象指针的指针。
该类应包含允许添加,删除和查找内部对象的方法。 现在这个班级看起来像这样:
class VectorKontener: public Kontener <VectorKontener> {
protected:
int find(Obiekt &n) {
cout << endl << "---------------------" << endl << "Running find method loop!" << endl;
for (int i = 0; i < stos.size(); i++) {
cout << "Now running for id: " << stos[i]->getId() << endl;
if (stos[i] == &n) return i;
}
return -1;
}
public:
VectorKontener::VectorKontener(Obiekt &n) {
add(n);
}
VectorKontener add(Obiekt &n) {
cout << "Adding: " << n.getId() << endl;
stos.push_back(&n);
return *this;
}
int checkPresent(Obiekt &n) {
return this->find(n) != -1;
}
VectorKontener remove(Obiekt &n) {
if (this->checkPresent(n)) {
stos.erase(stos.begin() + this->find(n));
}
else
cout << endl <<"ELEMENT NOT IN CONTAINER" << endl;
return *this;
}
VectorKontener display() {
cout << endl << "===DISPLAY===" << endl;
for (int i = 0; i < stos.size(); i++) {
stos[i]->display();
}
return *this;
}
};
但是,当运行以下测试数据时:
void Zad3()
{
Obiekt
obj1(5),
obj2(23),
obj3(234),
obj4(33);
cout << endl << "1. Class init" << endl;
VectorKontener k1(obj1);
cout << endl << "2. Adding other objects into array" << endl;
k1
.add(obj2)
.add(obj3)
.display();
cout << endl << "3. Element remove attempt" << endl;
k1
.remove(obj2)
.display();
getchar();
}
输出如下:
1. Class init
Adding: 5
2. Adding other objects into array
Adding: 23
Adding: 234
===DISPLAY===
This object has id: 5
This object has id: 23
This object has id: 234
3. Element remove attempt
---------------------
Running find method loop!
Now running for id: 5
Now running for id: 23
---------------------
Running find method loop!
Now running for id: 5
Now running for id: 23
===DISPLAY===
This object has id: 5
输出使得看起来数组的第三个变量在 find 方法(hehe)中丢失,因为它不是由它计算的,尽管stos.size()
显示了正确的值( 2)。
我不是cpp专家,公平地离它很远,并且我知道这可能是一个相当不错的问题,但我确实没有办法让它正常工作。
任何帮助真的很棒
答案 0 :(得分:1)
问题是函数返回对象的副本,这意味着在链式add
调用中原始对象不会被修改(在第二个和任何后续函数调用上),而是在每个函数调用上创建一个临时函数,并在之后立即销毁。
简单的解决方法是将返回值更改为引用,例如:对于add函数:
VectorKontener& add(Obiekt &n) {
而不是
VectorKontener add(Obiekt &n) {
其他功能的类似变化。