#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相同的對象可能會出現在容器數次,所以爲了節省空間,乙只存儲指向A.
的B ::推功能飼料類型A的對象到容器中。
他們重載A.
while循環在主函數結束的指針和數值是我想要的東西(有點像流媒體運營商的使用iostream對象)。
B中的迭代器「currA」會跟蹤函數調用B :: get_A()最後返回的元素,因此對該函數的連續調用將返回B :: content中的所有A對象,直到結束到達了。在這種情況下,內部迭代器將被重置,並返回一個帶有內部無效標誌(此處爲簡單起見A :: number爲0)的對象A.
該程序的輸出可能看起來像這樣:
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.)拷貝構造函數甚至與實際問題有什麼關係?如何實現複製構造函數解決問題?
使用初始化列表代替體內分配來初始化類別分支。 – Manu343726
在'push_back'的第二個重載中存儲着一個指向本地副本的指針,所以在push_back結束之後,該指針是無效的。 – Manu343726