2012-01-18 107 views
0

我遇到了作業問題。我有一個名爲Grid and Record的類。記錄是網格,用於存儲網格中每個位置訪問的次數。網格必須包含一個Record類型的數據成員,只要對網格進行更改就可以存儲該數據成員。我設法避免了循環依賴,但是我似乎遇到了導致堆棧溢出的「循環結構」問題。調用Grid構造函數創建一個Record,它創建一個Grid,它會嘗試創建另一個Record等等。我的第一個想法是讓Grid的Record數據成員成爲一個指針,我初始化爲NULL,然後在構造函數外部創建Record對象,但是該指定特別指出Grid的Record數據成員必須是Record類型的,而不是指向Record的指針。我也不允許給記錄一個默認的構造函數,所以我猜我的實現是錯誤的。有關如何解決此問題的任何建議?C++循環施工問題

Record::Record(int rows, int cols) : grid(new Grid(rows, cols)) {}; 

Grid::Grid(int rows, int cols) : record(new Record(rows, cols)) {}; 

回答

0

我認爲在作業中有一個誤解,或者寫得不好。

看來,你想要什麼:

Grid 
+---+---+- 
| a | b | 
+---+---+- 
| c | d | 
+---+---+- 

Record 
+---+---+- 
| 0 | 1 | 
+---+---+- 
| 2 | 2 | 
+---+---+- 

這表明a尚未訪問和d已被瀏覽過兩次。

現在,如果Grid應包含一個Record保持其統計數據,那麼Record不能是Grid。你注意到它是圓形的。但是,Record是一個網格。所以我懷疑這裏有一個錯字/閱讀問題。

我的建議:

class Record { 
public: 
    Record(size_t rows, size_t cols): rows(rows), cols(cols), grid(rows*cols, 0) {} 

private: 
    size_t rows; 
    size_t cols; 
    std::vector<size_t> grid; 
}; 


template <typename E> 
class Grid { 
public: 
    Grid(size_t rows, size_t cols): grid(rows*cols, 0), record(rows, cols) {} 

private: 
    std::vector<E> grid; 
    Record record; 
}; 
0

我不知道是什麼類型的設計結構,你會用,但這裏是一個解決您的問題。而不是創建一個新的東西,只需讓「內部」的構造函數將一個指向「外部」(稍後描述的術語)的指針。

所以,這將是

Record::Record(int rows, int cols) : grid(new Grid(rows, cols,this) {}; //outer 

Grid::Grid(Record* master) : record(master) {}; //inner 

「外」類是用戶應該使用一個。

「內部」類是由於實現的原因(或者像迭代器和繼承)。

在構造函數週圍進行交換,以便遵循上面的樣式。用戶不應該這麼做:Grid f(new Record(rows,cols));

請注意,這幾乎是java中內部類的非常粗略的近似值。

+0

我不允許改變的論據不幸的構造。網格和記錄都必須帶有兩個int參數。 – flurry 2012-01-18 06:30:21

+1

@Slipflurry記錄是否需要引用Grid?我認爲在沒有額外參數的情況下返回參考幾乎是不可能的(沒有不好的詭計)。也許這個任務寫錯了。 – Lalaland 2012-01-18 06:39:51

+0

你可能是對的。有點奇怪,看來唯一的解決方案是將所有從Grid類複製到Record中,以便它不再引用Grid ... – flurry 2012-01-18 07:03:54

0

爲什麼不讓錄製有一個虛擬功能,實際上是錄製然後讓網格只是一種錄製,然後覆蓋錄製功能。類似於:

class Record 
{ 
    virtual recordSomething(); 
} 

class Grid : Record 
{ 
    virtual recordSomething(); 
} 

我不知道我是否理解了您的問題,但我認爲這應該有所幫助。祝你好運。