2015-12-11 36 views
0

即使定義只有一行,如代碼構造函數或int value() const;,對於總是將聲明和定義分開來說,這是一種很好的做法嗎?有關C++模塊化的最佳實踐

我的目標是學習C++,並且同時包含最佳實踐。所以如果在這段代碼中有些東西需要改進,請告訴我。

//counter.h 
#ifndef COUNTER_H 
#define COUNTER_H 
#include <QObject> 


class Counter : public QObject 
{ 
    Q_OBJECT 
public: 
    Counter(); 
    int value() const; 

public slots: 
    void setValue(int value); 

signals: 
    void valueChange(int newValue); 
private: 
    int m_value; 
}; 

#endif // COUNTER_H 

-

//counter.cpp 
#include "counter.h" 

Counter::Counter() 
{ 
    m_value = 0; 
} 

int Counter::value() const 
{ 
    return m_value; 
} 

void Counter::setValue(int value) 
{ 
    if(value != m_value) 
    { 
     m_value = value; 
     emit valueChange(value); 
    } 
} 
+3

這是一個非常基於意見的問題,在這裏並不完全適用。無論哪種方式都有理由。這樣做可以防止編譯器內聯你的構造函數,最終損害性能。 – 1201ProgramAlarm

+0

@ 1201ProgramAlarm另一方面,存在像大多數增強的那些只有頭文件庫... :-) – skypjack

+0

C++模塊功能可能會使它們相等 – paulm

回答

1

類定義內部實現所有的功能是內聯。所以如果你把這些方法放在類定義裏面,你會把它們全部內聯。這不是等效的代碼。

C++中的最佳實踐是將盡可能多的定義轉移到.cpp文件,並儘可能保持.h文件的容易。如果頭文件中含有#include指令,請減少數量。儘可能使用類和結構的前向聲明,而不是完整的定義。

唉,這些指導方針不適用於模板,這就是C++編譯如此緩慢的原因。

+0

「最佳實踐」部分是以許多「最佳實踐」爲基礎的意見。然後,您的「最佳實踐」結束並不適用於所有語言功能(這意味着可以質疑它們是否最好)。 – skyking

+0

只需注意:inline關鍵字和由於定義在類定義中而隱式內聯,都是編譯器的*提示,而不是綁定:越來越多的編譯器會自行決定何時內聯函數定義在翻譯單元中是已知的,儘管它們可能需要命令行參數來考慮從另一個翻譯單元內嵌代碼(這是可取的,因爲它使得難以僅使用實現和重鏈接重新編譯翻譯單元)。 –

+0

@TonyD雖然注意到'inline',隱含與否,與ODR規則相關。 – juanchopanza