2012-06-21 69 views
0

我有1個父類(「Area」)和一些子類(「circle」,「polygon」等)。 其中一個虛擬繼承函數的行爲非常奇怪 - 它的輸入參數在運行時消失(在調試模式下可見)。這讓一些內存奇怪的錯誤.. 你有什麼想法(假設段班運作良好)參數在繼承函數中消失

class Point { 
    int x, y; 
public: 
    Point(){}; 
    Point(int xP, int yP):x(xP), y(yP){} 
}; 


class Area { 
public: 
    virtual ~Area() { 
    } 
    virtual bool contains(const Point& p1) const=0; 
}; 


class Circle: public Area { 
    double radius; 
    Point center; 
public: 
    ~Circle() {} 
    Circle(double radiusP, Point centerP) : 
      radius(radiusP), center(centerP) {} 
    bool contains(const Point& p1) const; 
}; 

和函數的定義(包含):

bool Circle::contains(const Point& p1) const { 
    return Segment(center, p1).getLength() < radius; 
} 
+1

你能不能給我們的錯誤嗎? – CatShoes

+2

1.需要更多關於錯誤的細節2.發佈調用「contains」方法的代碼 – 2012-06-21 20:14:40

+0

當你說消失時,你的意思是它的值在你的調試器中是不可見的,或者你得到一個顯式的內存錯誤通知? – mathematician1975

回答

1

P1是一個參考。如果p1被刪除,或者是在包含運行時超出範圍的臨時文件,則會出現內存錯誤。

@lezebulon臨時外出的範圍的一個例子:

Point& getPoint() 
{ 
    Point p; 
    return p; 
} 

void doStuff() 
{ 
    Point& p = getPoint(); // p is already bad... but will probably still work. 
    area->contains(p); // oops stack overwritten, p obliterated 
} 
+1

雖然 – lezebulon

+0

執行方法時臨時不能超出範圍,但在下一次調用之後,在另一個函數中被刪除的情況將是暫時的。 –

+0

你能舉個例子嗎?我不明白你在說什麼 – lezebulon