2014-03-02 219 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

感谢您的回答,但我需要狗类内部的指针,所以你不知道有一个可能的解决方案吗? –