2016-05-17 73 views
2

可以檢查(例如通過gcc)哪些方法或成員可以被移動到受保護或私有部分?確定方法或成員是否可以被保護或私有

+1

您可以將它們全部移至私有,然後檢查編譯器引發的錯誤。然後,根據錯誤信息,您可以將它們逐一移動到受保護的位置,以便派生類可以訪問它們。 –

+0

你的意思是說,公共API的哪些方法是未使用的(因此可以變成私有的)? – Niall

+1

它應該是指示哪種方法應該公開的API。 – Jarod42

回答

2

考慮下面的代碼部分:

class foo{ 
    protected: 
     void foo_method_1(){}; 
     int foo_member_var; 
}; 

class bar : public foo{ 
    void bar_method_1(){ 
     foo_method_1(); 
    } 
}; 

如果要確定哪些成員和Foo類的方法可以是私有的,你必須對所有這些移動到私人部分。因此,它看起來就像這樣:

class foo{ 
    private: 
     void foo_method_1(){}; 
     int foo_member_var; 
}; 
... 

現在,它不會編譯,這裏的海灣合作委員會拋出的第一個錯誤:

prog.cpp:5:8: error: 'void foo::foo_method_1()' is private 
    void foo_method_1(){}; 

從你知道,你必須將foo_method_1移到受保護部分。所以它看起來像這樣:

class foo{ 
    private: 
     int foo_member_var; 
    protected: 
     void foo_method_1(){}; 
}; 
... 

現在它會編譯。您必須爲班級中的每一種方法和成員重複此過程。對於公共部分,您可以按照上述相同的方式進行操作。

+0

我知道這種方法,但它很耗時。 – Marcin

+2

@marcin不幸的是。爲了加速它,你可以像這樣編譯你的代碼:'gcc -o foo bar.cpp 2> errors'然後'cat errors | grep「是私有的」。你將得到一個不能私有的函數列表。然後你可以一次把所有的人移動到受保護的位置。 –

2

您不能以編程方式執行此操作,否。 這實際上是一件好事。

當然,你可以創建一個工具,用C++解析器集成,然後—一個接一個—取得了一定的會員功能private留下任何那裏,沒有引起你的程序中的錯誤。

但是,爲了做到這一點,您的整個程序需要對該工具可見。也許如果你有一個簡單的項目,這不是一個問題,但如果你正在編寫一個字面上不可能的庫

即使你能做到這一點,你最終的班級設計將是一個絕對的混亂。 只有人類程序員知道API的哪些部分是爲公共消費而設計的,而不是,並且這與API的哪些部分是當前正在消費並不總是相同。

堅持手動的方式,但不要複製機器的方式,隨機猜測什麼是編譯和什麼不編譯。用你的大腦和你對這個班級應該做什麼的記憶,來確定哪些功能應該是public,哪些不應該。

理想情況下,在您首次設計您的課程時試圖讓它正確!你應該花更多的時間來設計你的程序,而不是實際編程它,否則你很快就會得到這樣的維護噩夢。

1

否。編譯器會看到您的代碼,而不是您的設計

相關問題