2013-04-18 76 views
0

考慮下面的代碼(我使用不完全是,但只是突出問題)類的成員函數改變類成員常量

class Pointarr //creates an array of points which can be recalled by object 
{ 
    public: 
    Pointarr(int, int, bool); 
    ~Pointarr(){}; 

    mutable Point array[]; 

    private: 
    void fillarray(int) const; 

    int const minpix; 
    int const mirrors; 
    bool const canvasfeed; 
}; 

void Pointarr::fillarray(int mirrors) const 
{ 
    Point zero(0,0); 
    for(int i = 0; i < mirrors; i++) 
    { 
     array[i] = zero; 
    } 
} 

Pointarr::Pointarr(Mat dt, int mpx, int mir, bool cf) : dot(dt), minpix(mpx), mirrors(mir), canvasfeed(cf) 
{ 
    fillarray(mirrors); 
} 

我會得到一些東西出來的首先,我在linux上本地使用gcc C++編譯器。我使用OpenCV庫,其中Point是一種變量類型,其格式爲(x,y)。我相信它只是在內存中使用足夠的空間來保存每個數字,所以對於兩個整數,x將是4bytes,y是4bytes。

我遇到的問題是構造函數聲明(Pointarr())中的變量正確初始化,我確認了這一點,但是當我調用fillarray(int)函數來填充零值,(0,0),它會導致變量mirrors和minpix都變爲0,因爲canvasfeed保持原樣,但這只是當鏡像等於1時。

現在,讓我們指定一些東西,當鏡像爲1時,fill array中的循環只運行一次,這意味着該數組只有一個值(一個點)。如果我將鏡像設置爲2,那麼canvasfeed也變爲0.我認爲很明顯fillarray函數分配了用於將我的私有變量保存到數組的相同內存,因此正在改變我的私有變量。這是一個問題,因爲我需要它們以備後用。

事情是,我導致認爲使私有變量爲常量意味着編譯器將會抱怨,如果在任何時候變量被改變,但它在這種情況下編譯罰款,如果我誠實,雖然我不'完全理解應該如何使用const(甚至幾乎不)。

所以最後問題是,我如何避免使數組使用這個我需要的其他內存,但仍然初始化它具有與鏡像相同數量的元素插槽。

回答

0

我導致相信使私有變量爲const意味着編譯器會在任何時候變量發生變化時發出抱怨。

要麼你誤會了,要麼你的信念不正確。有多種方法可以修改固有的const成員,編譯器甚至可能無法檢測到它。最終,這會導致未定義的行爲。

您是確保直接或間接不會修改固有const數據成員的人。


mutable Point array[]; 

已知爲不完整的陣列的類型Point的,這是保證僅存儲單個元件。當您使用它來存儲更​​多元素時,最終會超出數組的界限,導致未定義行爲

您需要使用的載體:

mutable std::vector<Point> array; 
+0

非常感謝您的回覆,我會嘗試這一點,看看會發生什麼,如果不是太麻煩但是,你能可能使用說明什麼具體區別一個向量使得(除了使它工作),因爲我現在還在學習。只需鏈接到合適的資源,我們將同樣感激。 – user2295561