1樓:GarfieldKwong
你編譯錯誤的原因其他答主已經說清楚了,就是DepthFirstSearch裡的成員Graph g導致的。DepthFirstSearch的建構函式沒有顯示初始化Graph g,編譯器預設呼叫Gragh()。良好的是類的建構函式裡每個成員變數都要顯示初始化。
其實編譯器裡DepthFirstSearch的建構函式完整是下面的樣子,只不過你沒寫編譯器幫你做了。
DepthFirstSearch
(Graph&g
,ints)
:marked
(nullptr),g
(),cnt(n
)當你這樣寫的時候你就會發現問題了,變數g要怎樣建立呢?因為Graph沒有Graph()建構函式,所編譯器就報錯了。而進一步你就會發現你沒有資料來對g進行初始化。
所以這裡DepthFirstSearch裡的g不應該是Graph的例項,用指標會合理一點,而且每次this->g = g;的時候會呼叫Graph的assign operator (忘記了中文是什麼了,就是Graph &operator =(const Graph& other而裡面會需要對Graph拷貝,這個拷貝是不必要的,用指標會合理一點。
所以DepthFirstSearch應該改成:
class DepthFirstSearch{
private:
bool *marked;
const Graph* g; // 按道理來說DepthFirstSearch不應該改變g的,所以加上const
int cnt;
...public:
DepthFirstSearch(Graph &g, int sthis->g = &gcnt = 0marked = new bool [g.Vfor(int i=0; i
題外話:
你的程式有記憶體洩漏,各種new但是沒有delete。
DepthFirstSearch裡的marked不需要是指標,你這裡就new了之後沒有delete。你需要的其實是陣列而已。我猜你想的是Graph的v不是確定值,不能建立陣列,你可以用std::
vector就好了,免得new出來之後要delete這種麻煩。
c++11已經出來很多年了,建議還是用智慧型指標代替原始指標吧,會少很多麻煩。
python的類中乙個函式名先宣告時什麼用法,為何self prediction,呼叫的時候沒有括號?
python中變數和函式都不需要提前宣告,函式直接定義就可以了。這裡提前宣告不知道是寫的人習慣了其它語言,還是為了可讀性。在python中一切皆物件,函式也不例外。因此可以將函式繫結到變數上或者傳遞,使用時後面加上 就可以呼叫。在下面的方法中self.prediction後面沒有加 但是又把它和乙個...
C 函式怎麼實現同乙個形參位置可以接受不同型別的實參?
王賽 這也算是多型,有多種手法可以達到這個目的。預處理期用函式巨集。編譯期用過載或模板。執行期的用型別擦除,可以用 variant 或 union 擦除限定範圍型別,callback 風格使用 void std function 或是 virtual 介面的類型別。 d41d8c 正常寫就行。比如 ...
C 返回類時,返回引用還是構造乙個新的例項,什麼時候返回const?
Sunchy321 1 把print的形參改成A const 我不能理解為什麼要改成右值引用,如果有人能向我解釋清楚我非常感謝。A 能接受A const大概說明了什麼。2 我認為,是否返回引用其實取決於返回值是不是乙個新的物件。當然,operator 有其準則,也就是模仿內建運算子的行為 當然,不可...