2009-08-07 59 views
0

我有一個C++類,其中許多成員函數都有一組通用操作。將這些常用操作放在單獨的函數中對於避免冗餘很重要,但理想情況下我應該在哪裏放置此功能?使它成爲類的成員函數並不是一個好主意,因爲它沒有意義成爲類的成員函數,並將其作爲頭文件中的獨立函數,但似乎並不是一個好的選擇。 有關這個相當設計問題的任何建議?在類中放置方法

回答

4

如果「操作集合」可以被封裝在一個函數中,而該函數並非固有地綁定到有問題的類上,那麼它可能應該是一個自由函數(可能在適當的名稱空間中)。

如果它以某種方式綁定到類但不需要類實例,它應該可能是static成員函數,如果它不構成類接口的一部分,可能是private函數。

0

你應該把它作爲私人成員函數。這是他們的目的。

+1

這是拇指的壞規則,因爲它可以讓你最終的私有成員函數很多,很多(所以你必須接觸到例如朋友大的界面) 。 – 2009-08-07 11:53:00

+0

是的。在某些情況下,情況確實如此。 – lhahne 2009-08-08 16:03:12

0

我不確定爲什麼製作私有成員函數不是正確答案,但如果不是,請將其作爲您的成員函數在同一個.cpp文件中的靜態獨立函數。

+0

使它成爲私人的是C++中的劣勢,因爲它然後成爲該類的可見(如果不可訪問,即「朋友」)接口的一部分。另外,一個未命名的名字空間是現在做靜態函數的方式。 – sbi 2009-08-07 12:38:39

4

讓它在CPP文件的匿名命名空間的自由函數定義使用它的功能:

namespace { 
    int myHelperFunction(int size, Bar &target) { 
     ... 
    } 
} 

int Foo::doTarget(Bar &target) { 
    return myHelperFunction(this->size, target); 
} 

template <typename IT> 
int Foo::doTargets(IT first, IT last, int size) { 
    size += this->size; 
    int total = 0; 
    while (first != last) { 
     total += myHelperFunction(size, *first); 
     ++first; 
    } 
    return total; 
} 

或什麼的。

這是假設一個簡單的設置,其中您的成員函數在一個頭文件中聲明,並在一個翻譯單元中定義。如果它更復雜,可以將其設置爲類的私有靜態成員函數,並將其定義在包含成員函數定義(或添加一個新成員函數)的翻譯單元之一中,否則只要給它自己的頭文件就可以了已經很長時間的將文件分解成文件。

0

如果您的C++類是其成員使用此通用功能的唯一類,那麼我會將該方法放在使用該功能的類中。但是,如果有可能另一個班不得不做同樣的工作,那麼你應該將其移入輔助班或圖書館(具有這種性質)。

+0

爲什麼把它放進課堂?請參閱Frerich對lhahne的回答的評論。 – sbi 2009-08-07 12:36:38

3

如果您的類的多個成員函數共享通用代碼,則必須查看共享的代碼以確定它的位置。

如果共享代碼只能使用該類的公共接口(因此它不訪問私有成員變量,受保護的函數等),則應考慮其他類是否可能要使用相同的代碼。如果沒有其他類可以使用的功能,把共享代碼爲全球性的(自由)功能的匿名命名空間內的.cpp文件,就像這樣:

namespace { 
    void mySharedCode() { 
    // ... 
    } 
} 

void MyClass::f() { 
    doThis(); 
    mySharedCode(); 
} 

void MyClass::g() { 
    doThat(); 
    mySharedCode(); 
} 

如果共享的代碼不能使用實施只是公共接口(也許代碼使用私有成員變量或其他),使其成爲該類的私有成員函數。但是,如果共享代碼只使用類的一些(即一個或兩個或那些)成員變量,則可以更改該共享函數,以便共享函數將這些值作爲變量傳遞。即使用

// GOOD: free function in .cpp file used 
namespace { 
    int multiply(int a, int b) { 
    return a * b; 
    } 
} 
void MyClass::f() { 
    return multiply(m_a, m_b) + 3; 
} 

,而不是

// BAD: private member function used 
void MyClass::multiply() { 
    return m_a * m_b ; 
} 
void MyClass::f() { 
    return multiply() + 3; 
} 
+0

這幾乎就是我所寫的,如果這還沒寫完。 – sbi 2009-08-07 12:39:10