2014-03-02 220 views
-1

我有一個代碼的幾個問題,它具有與此示例類似的結構。它不起作用!我認爲主要的問題是push_back函數,我需要其他範圍(我需要在操作過程中構建一個類的向量,並且在內部有單個類的指針)。任何人都知道如何解決它?由於指向類中對象的指針:push_back和指針衝突

#include <vector> 
using namespace std; 

class meow { 
public: 
    int b; 
    meow() { 
    b = 1; 
    } 
    meow(int a) { 
    b = a; 
    } 
}; 

class dog { 
public: 
    vector<meow> H; 
    vector<vector<meow>::iterator> HP; 

    dog() 
    : HP(2), H(2) { 
    HP[0] = H.begin(); 
    HP[1] = H.begin() + 1; 
    } 
}; 

int main() { 
    vector<dog> WOOF(1); 
    WOOF.push_back(dog()); 
    meow ok(2); 
    (*WOOF[1].HP[0]) = ok; 
    cout << (*WOOF[0].HP[0]).b << endl; 
    cout << (*WOOF[1].HP[1]).b << endl; 
} 

OK,我明白了這筆交易,所以是有可能做這樣的事情,在這我不會在代碼的push_back後使用事件?

#include "stdafx.h" 
#include <iostream> 
#include <vector> 

using namespace std; 

class meow { 
public: 
    int b; 
    meow() { 
    b = 1; 
    } 
    meow(int a) { 
    b = a; 
    } 
}; 

class dog{ 
public: 
vector <meow> H; 
vector<vector<meow>::iterator> HP; 
dog(): 
    HP(2),H(2){ 
} 
    void Referring(){ 
     HP[0]=H.begin(); 
     HP[1]=H.begin()+1; 
    } 
}; 


int main() { 
    vector<dog> WOOF(1); 
    WOOF.push_back(dog()); 
    for(int i=0;i<WOOF.size();++i){ 
     WOOF[i].Referring(); 

    } 
    meow ok(2); 
    (*WOOF[1].HP[0]) = ok; 
    cout << (*WOOF[0].HP[0]).b << endl; 
    cout << (*WOOF[1].HP[1]).b << endl; 
} 
+1

什麼「不起作用」?你期望會發生什麼,而發生什麼呢?你有沒有收到任何錯誤信息?你真的不清楚發生了什麼問題...... – sth

+1

這種情況下的經典問題是,push_back會將整個向量移動到內存中,任何指向它的指針都會變成懸掛的。 – user2672165

回答

1

狗類需要一個副本。這是至少有一個致命的問題,導致在push_back時造成災難,因爲創建了狗的副本。默認拷貝ctor將按值複製指針,以便它們指向錯誤的(舊)地址。增強犬類:

class dog { 
public: 
    vector<meow> H; 
    vector<vector<meow>::iterator> HP; 

    dog() : HP(2), H(2) 
    { 
    HP[0] = H.begin(); 
    HP[1] = H.begin() + 1; 
    } 
    dog(const dog& rhs) : H(rhs.H),HP(2) 
    { 
    HP[0] = H.begin(); 
    HP[1] = H.begin() + 1; 
    } 
    dog& operator=(const dog& rhs) 
    { 
    if(&rhs==this) 
     return *this; 
    H=rhs.H; 
    HP[0] = H.begin(); 
    HP[1] = H.begin() + 1; 
    } 

};

+0

@Tommaso法拉利:在我上面的回答中提出了一個解決方案!創建一個拷貝構造函數(和一個拷貝賦值操作符)。請參閱http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)。你的情況不需要析構函數,但有一些例子。 – user2672165

+0

我已經完成了你的消化。它不起作用!在調試中說,在HP [0] = H.begin();' –

+0

@Tommaso Ferrari:線路出錯了。改爲:狗(常規狗和右手):H(rhs.H),HP(2)。惠普規格未初始化爲兩個。 – user2672165

3

dog::HP中,存儲指向dog::H向量元素的迭代器。當複製dog對象時,新對象的HP中的複製迭代器仍將指向原始對象的向量H。當原始對象被銷燬時,新對象中的迭代器不會再指向任何有用的東西。

這是在main()中發生的情況,其中臨時對象dog被複制到WOOF中。

另外一般來說,將迭代器存儲在這樣的迭代器中可能不是一個好主意。當H被修改時,HP中的所有迭代器都將失效並且不再安全使用。

+0

感謝您的回答,但我需要狗類內部的指針,所以你不知道有一個可能的解決方案嗎? –