2013-01-11 41 views
2

你好,先生們和MAMS)派生構造函數警告:永遠不會被執行

我剛剛拿到了一些奇怪的問題,同時proging C++,使用代碼:: Blocks的10.05,FreeBSD的9.1

來源lib.cpp:

class A{ 
    public: 
    A(); 
    A(var1, var2); 
}; 
A::A(){ imlementation } 
A::A(va1, var2) {implementation } 
class B : public A{ 
    public: 
    B(); 
    B(var1, var2); 
}; 
B::B() : A() {} // this is Astr# 
B::B(var1, var2) : A(var1, var2) {} // this is Bstr# 

來源lib.h:在main.cpp中

class A{ 
    public: 
    A(); 
    A(var1, var2); 
}; 
class B : public A{ 
    public: 
    B(); 
    B(var1, var2); 
}; 

來源:

#include "lib.h" 
... 
int main(){ 
    ... 
    B* Bptr = new B(); 
    B* Bptr2 = new B(var1, var2); 
    ... 
} 

而且我得到這些構建警告:

.../lib.cpp||In constructor 'B::B(var1, var2)': 
.../lib.cpp|Bstr#|warning: will never be executed 
.../lib.cpp||In constructor 'B::B(var1, var2)': 
.../lib.cpp|Bstr#|warning: will never be executed 
.../lib.cpp||In constructor 'B::B()': 
.../lib.cpp|Astr#|warning: will never be executed 
.../lib.cpp||In constructor 'B::B()': 
.../lib.cpp|Astr#|warning: will never be executed 
||=== Build finished: 0 errors, 4 warnings ===| 

這個警告只出現在調試模式下,發佈版本似乎去確定。 該代碼構建並運行良好,但我做錯了什麼?

+1

爲什麼在.h和.cpp中都有類A和類B的定義? –

+2

1)'B :: B(var1,var2):B {}'這不應該被編譯。我想你想寫'B :: B(var1,var2):B(){}'。 2)B的構造函數是私有的,這就是爲什麼'new B'不應該被編譯3)爲'var1'和'var2'添加類型 – borisbn

+0

請嘗試給出工作示例代碼。 – mkluwe

回答

0

警告:永遠不會被執行

是海灣合作委員會的警告,可與-Wunreachable-code啓用。 -Wunreachable-code是非常不可靠的,不應該使用;由於這個原因,在GCC的新版本中,整個選項被完全刪除。 (實際上,並未完全刪除:命令行選項-Wunreachable-code仍然存在,但它不再執行任何操作。)

3

lib.h中的構造函數B(var1,var2)是私有的。

+0

'B()'也是私有的 –

+0

我剛剛在這裏錯過了lib.h代碼中的「公共」行,並且我將B作爲公有A,爲什麼它們應該是私有的? –

+0

@DizzzyDozzzer:因爲默認是私人的。當你從A公開派生出來時,這對B的構造函數的可見性沒有影響(因爲它們在A中不存在)。您應該從lib.cpp btw中刪除聲明B,並保留定義。而且我看到你編輯了你的代碼,同樣的錯誤仍然出現了嗎? – Axel