foo.h
#ifndef FOO_H
#define FOO_H
class Foo
{
int fooObj1;
bool fooObj2;
public:
Foo(int input1);
};
#endif
檔案
#include "foo.h"
Foo::Foo(int input1)
{
fooObj1 = input1;
// some code logic to decide the value of fooObj2 (an example)
// so I can't really do member initialization list.
fooObj2 = (fooObj1 % 2 == 0);
}
所以我正在學習一個教程,他們告訴我打開[-Weffc ]并將警告視為錯誤。但是當我這樣做時,[-Weffc ]發出警告: 'Foo::fooObj1' should be initialized in the member initialization list [-Weffc ]和'Foo::fooObj2' should be initialized in the member initialization list [-Weffc ]。但是在這個專案中我真的不能做成員初始化串列。那么我怎樣才能重新喜歡這個警告呢?
uj5u.com熱心網友回復:
Foo::Foo(int input1)
: fooObj1(input1)
, fooObj2(input1 % 2 == 0)
{
}
請注意,fooObj2 的值是根據 input1 引數計算的,而不是 fooObj1 值。理由是,如果您要更改標題中的順序:
class Foo
{
bool fooObj2;
int fooObj1;
public:
Foo(int input1);
};
如果您從 fooObj1 計算 fooObj2,您最終會處于 fooObj1 的未初始化記憶體中。成員按照它們在類中出現的順序進行初始化,而不是按照它們在建構式的初始化串列中出現的順序。
uj5u.com熱心網友回復:
Foo::Foo(int input1) : fooObj1(input1), fooObj2(0 == input1 % 2) {}
uj5u.com熱心網友回復:
-Weffc 產生一些偏執的警告,但有一個你想要遵循的理想。例如你總是可以做部分串列:
Foo::Foo(int input1) : fooObj1(input1) /*, fooObj2() still can be here */
{
// some code logic to decide the value of fooObj2 (an example)
// so I can't really do member initialization list.
fooObj2 = (fooObj1 % 2 == 0);
}
請注意,建構式體中的代碼不是初始化。這是一個任務。類的成員仍然按照其宣告的順序使用實作定義的或不確定的值進行初始化。
在某些多執行緒情況下,如果 Foo 的成員是原子的并且某些東西可以同時訪問它們,則差異可能很重要。
分析邏輯很重要,它是否需要分支,它實際上是編譯時已知的常量嗎?您可以使用簡單的三元進行初始化嗎?
在復雜的情況下 fooObj2,甚至可能是另一個型別別的物件,它自己的建構式隱藏了“復雜邏輯”,以避免確定初始化順序時出現問題。
uj5u.com熱心網友回復:
消除警告的兩種解決方案。
解決方案1
制作一些靜態方法,例如CalculateFooObj2InitialValue,并在成員初始化串列中使用它。
Foo::Foo(int input1):
fooObj1(input1),
fooObj2(CalculateFooObj2InitialValue(input1)) {
...
}
解決方案2
使用fooObj2成員初始化串列中的默認值進行初始化,但意義不大。然后稍后計算一個有意義的初始值并賦值。
Foo::Foo(int input1):
fooObj1(input1),
fooObj2{} {
// some code logic to decide the value of fooObj2 (an example)
// so I can't really do member initialization list.
fooObj2 = (fooObj1 % 2 == 0);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329032.html
上一篇:如何檢查boostasioasync_read_some、async_write_some的回傳型別
下一篇:為什么寫入此向量會引發例外?
