c 中,如果建構函式構造失敗,如何終止並且不建立物件?

時間 2021-06-01 23:15:23

1樓:「已登出」

方案一:

class Foo {

public:

explicit Foo(int arg) {if (arg <= 0) {

throw ERROR_BADARGUMENTS;

方案二,構造前判斷,失敗返回nullptr:

class Foo {

private:

explicit Foo(int arg) {public:

static int Make(Foo** ppOut, int arg) {

if (!ppOut) {

return ERROR_BADARUGMENTS;

*ppOut = nullptr;

if (arg <= 0) {

return ERROR_BADARGUMENTS;

*ppOut = new Foo(arg);

return ERROR_SUCESS;

方案三,構造後判斷是否成功,std::fstream就是這麼做的:

class Foo {

public:

explicit Foo(int arg) {arg_ = arg;

if (arg >= 0) {

bool IsValid(void) const {return arg_ >= 0;

private:

int arg_;

2樓:mwish

class A , arg2{} catch

不曉得是不是可以用 function-try-block. 你也可以自己 catch, 或者考慮用乙個 base class 管理申請的資源啥的, 有問題就會丟擲來,等你捕捉的時候看看 stack unwind?

3樓:張強

operator bool()

當你使用時,就是這樣的:

Stock * sto = new Stock(-1);

if (!sto || !*sto)

本來單一判斷系統是否正常分配token指標的,這裡多加乙個bool判斷,這兩個錯誤所走的都是同乙個邏輯。或者

Stock sto(-1);

if (!sto) ;

只是比原來多了一步呼叫bool過載的操作,修改了一點邏輯流程,但不影響美觀,並且還可以在bool過載中做其他判斷操作,相當於定義乙個統一的規則。

4樓:

你試一下禁止複雜建構函式,僅保留乙個用來初始化成員的建構函式,之後用static成員函式做構造。這樣一來,就不會出現建構函式失敗了。

比如:auto file = File::create("a.txt");

5樓:exiledkingcc

雖然可以拋異常。但是這裡拋異常沒什麼用。

如果這個東西一定是處於乙個合法的狀態,而沒有不合法的情況。那麼你應該提供乙個只能構造出合法物件的構造方法。比如在題目描述的問題,可以使用unsigned引數去構造。

或者提供乙個靜態的create方法之類的方式。

如果不合法也是一種可以存在的狀態。那麼可以提供乙個bool valid()之類的方法交給業務邏輯去處理。

6樓:dearcc

做好就是構造拋異常!那些說不用異常的,不知道是怎麼說服自己!使用異常是設計者設計的初衷,二段構造屬於強迫使用者的行為,且無法控制物件的不變狀態,不太推薦!

工廠方法加構造異常,個人推薦!

7樓:心裡藏著小怪獸

應該需要丟擲異常,並自行釋放資源。

首先,建構函式沒有返回值,所以沒有辦法自己返回狀態。即使當建構函式內部的失敗時,自行把物件中成員和自身所佔記憶體釋放掉,呼叫處是無法知道的。這讓呼叫處很難辦呀。

當然你可以用全域性變數來傳失敗狀態,但是想想就頭皮發麻。

其次,物件可能在棧上(堆物件的子成員也類似),棧上記憶體無法自行釋放,坑肯定是占定了,難道還要在建構函式裡區分堆變數棧物件嗎

8樓:d41d8c

要從建構函式匯報錯誤,那只能用異常。

不過在這個具體的例子裡面,是由於引數不正確導致的錯誤。按照Herb Sutter的觀點,這種情況不應該用異常,而應該用Contracts。然而目前標準委員會還沒對Contracts的設計達成任何共識……

9樓:暮無井見鈴

你實在不想要異常的話,可以用 optional (只需標識錯誤的存在)或者 variant (需要表示錯誤的狀態)。覺得後者開銷大的話可以弄個 boost::expected 或者自己實現個 expected 。

但千萬要注意:截止至 C++20 ,語核都沒有提供專門的控制流支援這些錯誤處理方式,所以必須自己小心使用約定的寫法。

10樓:虞坤霖

標準做法是,建構函式永不失敗。

建構函式只負責初始值。實際外部傳入的資料放在Init()成員函式中。這個成員函式返回值為 bool。

另外,永不使用異常。有奇效。

C 建構函式問題?

寫程式碼的冰冰 c 是一種強型別的語言,任何變數,函式,類在使用之前,需要先宣告。編譯器根據宣告生成函式簽名,此簽名相當於乙個ID,根據各編譯器的具體實現,在生成簽名的時候只考慮類名,函式名,引數型別及數量,因此,此處的變數名可以省略。 再努力一點點 這是型別轉換建構函式 建立A型別的物件時,如果接...

C 的預設建構函式,複製建構函式 有無 const ,成員型別變成 no class type ?

叛逆者 既然你要的是拷貝構造,為什麼不就好好的按照拷貝構造的規範來,引數老老實實用const T 而要T Detail 這種臨時物件,你難道想改不成。std string型別的引數,要const 或者 從初學就該養成這樣的好習慣。operator 的引數也要是const。也是從初學就該養成這樣的好習...

c 關於複製建構函式的使用?

首先前兩次是因為 Line line myp1,myp2 這個建構函式是這樣的 Line Line Point xp1,Point xp2 p1 xp1 p2 xp2 可以看出是把物件按值傳入,所以編譯器可能會完成下面的操作 Point temp1 xp1 Point temp2 xp2 呼叫構造拷...