c 中乙個只有有參建構函式的類怎麼做為函式的形參?

時間 2021-06-09 03:32:24

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 有其準則,也就是模仿內建運算子的行為 當然,不可...