我專門QApplication為構造引數MyApplication取值int。
class MyApplication : public QApplication
{
public:
Foo( int argc, char **argv ) : QApplication( argc, argv )
{
...
}
};
在我的代碼中,這個類再次專門用于許多地方。
不幸的是,我使用int了 ,而我應該使用int&(如Qapplication預期的那樣)。在 Windows 下它沒有造成任何問題,但是當我轉移到 Linux 時它開始崩潰。所以我改為MyApplication:
class MyApplication : public QApplication
{
public:
Foo( int& argc, char **argv ) : QApplication( argc, argv )
{
...
}
};
但是,所有專門化的類MyApplication也需要更新,而且有很多,如果沒有,代碼仍然可以編譯,但很可能會崩潰。
我需要確定所有應該應用更改的地方,但我也想防止新代碼犯同樣的錯誤。
有什么方法/技巧可以防止專門int化而不是 `int&' 來編譯?
我希望不允許使用此代碼并產生編譯錯誤:
class OtherApplication : public MyApplication
{
public:
Foo( int argc, char **argv ) : MyApplication( argc, argv )
{
...
}
};
uj5u.com熱心網友回復:
總結一下您的問題:您需要更改函式的簽名(在本例中為建構式),并且在使用它的任何地方都需要進行某種相應的更改,但簽名更改并不總是會導致在每次編譯失敗時,您可以拉起并修復,然后移至下一個。
解決方案是保證編譯失敗:
MyApplication( int &argc, char **argv, int ignore ) : QApplication( argc, argv )
現在,由于缺少引數,您可以保證編譯失敗。
作為修復每個保證編譯失敗的一部分,您還將添加一個虛擬 0 引數。
一旦所有編譯失敗都得到修復,并且代碼編譯,您現在將回傳并洗掉虛擬引數。是的,您將得到另一輪修復每個編譯失敗的問題。但是每個都是微不足道的,只需洗掉額外的0引數,這種方法保證了對原始建構式的每個現有用法的正確更新。
uj5u.com熱心網友回復:
一種方法是將引數包裝在您自己的結構中并傳遞它。這會強制子類構造使用該簽名。
如果出于某種原因您想在建構式中添加額外的東西而不去修改所有內容,它還可以提供更大的靈活性。在某些 API 中使用了這種技術,以避免通過微小的更改破壞函式簽名。
為了簡單起見,我已經顯示了這個行內,但如果你愿意,你當然可以隱藏實作。
class MyApplication : public QApplication
{
public:
struct Args final
{
Args(int& argc, char** argv) : argc(argc) , argv(argv) {}
int& argc;
char** argv;
};
MyApplication(const Args& args)
: QApplication(args.argc, args.argv)
{
}
};
int main(int argc, char** argv)
{
MyApplication myapp({argc, argv});
// ...
}
uj5u.com熱心網友回復:
你可以argc像這樣傳遞一個指標:
MyApplication(int *argc, char **argv): QApplication(*argc, argv)
這樣你就可以明確地強制“通過參考傳遞”語意。當然,您仍然需要更改所有派生類,但如果不這樣做,您會得到編譯錯誤。派生類建構式,如
OtherApplication(int argc, char **argv): MyApplication(argc, argv)
將無法編譯,甚至迫使后來創建新派生類的人考慮問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/528356.html
標籤:C qt
