2010-02-19 67 views
0

我最近在調試一個奇怪的C++的問題,其中新申報矢量莫名其妙的大小爲477218589.這裏的背景:奇異向量初始化問題

struct Triangle { 
    Point3 a,b,c; 
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {} 
    Vector3 flat_normal() { return (a-c)^(b-c); } 
}; 

vector<Triangle> triangles; 

調用triangles.size()返回值477218589。 我通過將struct Triangle更改爲class Triangle來「解決」了問題,但我想知道爲什麼有什麼區別。我應該做那typedef struct Foo { ... } Foo;魔法嗎?如果是這樣,爲什麼會有幫助?

如果很重要,我使用g ++ - 4.1。

+1

由於更多的原因,你所描述的可以安全地稱爲「不太可能」。顯然,你並沒有發佈整個代碼。不,修改'struct'到'c​​lass'不會解決問題,如果有的話,除了導致翻譯單元的重新編譯之外。 – AnT 2010-02-19 08:08:02

+0

如果要在調試期間可靠地監視變量,則必須關閉優化。如果程序本身輸出了錯誤的值,請發佈一個表現行爲的最小可編譯片段。 – avakar 2010-02-19 08:33:34

+0

好吧,我還沒有能夠重現其他地方的錯誤,所以顯然它不存在! :-P謝謝,無論如何。 – perimosocordiae 2010-02-19 10:07:23

回答

1

#include <vector> 
#include <iostream> 

struct Point3 {}; 

struct Triangle { 
    Point3 a,b,c; 
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {} 
}; 

int main() 
{ 
    std::vector<Triangle> triangles; 

    std::cout << triangles.size() << '\n'; 

    return 0; 
} 

打印0我。如果它也適合你,那麼問題在於部分代碼未包含在此代碼段中。如果它打印其他東西,你的編譯器/ std lib/setup會有些腥意。

+0

嗯,這是一個事後的想法:除非它提供了一個默認的構造函數,否則你不能使用帶有「std :: vector」的類型。 (我的編譯器沒有檢測到這個,因爲代碼片段永遠不會嘗試填充向量。)由於'Triangle'沒有提供默認的構造函數,所以在技術上它可能會調用未定義的行爲。 – sbi 2010-02-19 07:54:34

+0

默認的構造函數只有在您調用方法並希望使用默認值時才需要。 'vec.resize(10);' - 需要默認構造函數,否則將不編譯,'vec.resize(10,Something(x,y));' - 不需要默認構造函數。 – UncleBens 2010-02-19 08:12:15

+0

@UncleBens:謝謝你的澄清! – sbi 2010-02-19 22:29:47

1

聲明Triangle作爲一個結構或類應該沒有區別 - 在C++中,兩者的區別在於成員的默認訪問規範是公共的struct和私人的類,但就是這樣。

還有什麼更多Triangle,你不包括?

+0

我不認爲有任何區別!我已經添加了「Triangle」的全部內容。 'Point3'和'Vector3'是簡單的類。 – perimosocordiae 2010-02-19 07:30:14