2012-12-14 53 views
2

當談到C++中的const類型時,我總是會迷失方向,而我的問題實質上就在於這些。我怎樣才能使構造函數採取非const對象?

我遇到了以下情況:我有一個類Matrix基本上是一個二維鏈表(帶有哨兵的環)和一個類似迭代器的類,它可以選擇一行(選擇行的方法)然後通過它(操作符++)。爲了獲得這個結果,迭代器存儲3個指針:主標記,選定子列表(行)的標記和當前選定的節點(讓我們將其命名爲插入)。如果operator ++命中子列表sentinel - 那麼到達一行的結尾,如果行選擇命中主標記,那麼我們已經到達矩陣的末尾。

現在,由於列表是單鏈接的,我希望我的迭代器提供刪除功能,因此我決定將Node**類型存儲在迭代器中的當前節點字段中。但是這會對構造函數產生一些問題。

我決定只允許兩種類型的構造函數 - 一種取矩陣,一種取其他迭代器。這是我的問題。從矩陣創建的迭代器的初始狀態將其所有指針指向同一點 - 主標記。現在,似乎從g ++告訴我,我的構造函數採取Matrix必須採取const Matrix&類型。但是如果是這樣的話,我不能指定我的脫字符號(Node**)指向Matrix自己的指針,因爲它是常量,而脫字符不能是const。

我該如何解決這個問題?爲什麼構造函數不能使用非const實體?我可以在構造函數中將矩陣從const轉換爲非const嗎?在此先感謝您的任何提示。

+0

你爲什麼不告訴我們你的代碼的相關部分?我認爲這會讓問題更容易理解。 – NPE

+1

你的Matrix類應該爲你的拷貝構造函數提供迭代器和常量迭代器來處理它們。如果你提供了相關的代碼,我們可以給你一些想法。 – didierc

+0

複製構造函數應該這麼做,它的名字是什麼,它複製了一些(相同類型的)而不會對源對象造成嚴重破壞。無論您是否有Matrix,Matrix&,const Matrix的重載,僅僅是含糊不清和性能。我想,你可能會遇到所有這些指針的麻煩,因爲看起來,你的迭代器可以用來修改一個矩陣,它是由它構造的。因此,您需要複製實際數據以獲取嚴格的資源所有權或其他方法,以滿足您的需求 - 我們稱之爲子矩陣。所以是的,你應該給我們看一些代碼。 – Sam

回答

1

您必須將Matrix和迭代器分開,這樣只是迭代不會以任何方式更改Matrix,並且迭代所需的任何數據都存儲在迭代器類中。此外,如果您需要迭代器對常量矩陣對象進行操作,則還需要提供一個常量迭代器,該迭代器可以具有常量引用/指向矩陣的指針。但是在複製構造函數中,你不一定需要這個,你可以直接訪問字段,它畢竟是同一個類。

要讓迭代器類訪問Matrix的內部,可以使用friend關鍵字,或者(最好)可以使迭代器類的Matrix內部類。

相關問題