2008-10-29 87 views
11

我想知道是否有可能在主程序中添加方法到頭文件中定義的現有類。 例如: 有文件CFun.hpp定義class CFun,但在我們party.cpp我們要添加一個方法void hello() {cout << "hello" << endl;};,而無需編輯CFun.hppC++將方法添加到頭文件中定義的類

顯然(不幸)建設:

#include "CFun.hpp" 

class CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

不起作用返回一個錯誤Multiple declaration for 'CFun'

是否有可能使其工作沒有類繼承?

回答

9

沒有,但你可以添加需要引用/指針CFUN類的方法 - 你只是將不能訪問私人數據:

void Hello(CFun &fun) 
{ 
    cout << "hello" << endl; 
} 

這可能是你會是最好的能夠做到。正如litb指出的那樣 - 這個函數必須和CFun在同一個命名空間中。幸運的是,與類不同,名稱空間可以添加到多個位置。

+1

你應該告訴他的功能需要在同一個命名空間像班上。否則只需調用Hello(some_cfun);不會找到你好。你將不得不寫foo :: Hello(some_cfun);然後(ADT將不起作用) – 2008-11-28 17:27:55

0

不是我所知。雖然,你可以做一些類似陪審團的事情,並制定一個命名空間解決方案。

3

不,這是不可能的。任何特定類只能有一個定義,並且它必須是一個完整的定義,這意味着您不能在不同的地方進行部分定義,從而爲該類添加成員。

如果您需要向某個類添加成員函數,那麼要麼必須更改類定義(編輯CFun.hpp),要麼從CFun派生一個新類並在那裏放入hello()

0

想過之後,你可能會做一些糟糕的事情:在CFun中找到一些你想要的返回類型的函數,並且只在整個頭文件中提到一次。比方說void GoodBye()

現在創建一個文件CFunWrapper.hpp與此內容:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye() 
#include "CFun.hpp" 
#undef GoodBye 

然後永遠只包括CFunWrapper.hpp代替CFun.hpp。

但是不要這樣做,除非有充分的理由這麼做。根據CFun.hpp的內容,它非常容易中斷,甚至可能不可能。

+0

這樣做只是修改CFun.hpp。想到這種情況會起作用是很困難的,但是你不能只改變頭文件。我想它可能在ROFS上。 – 2008-10-29 23:28:36

2

在C++中最類似於​​那種構造(添加預定義類的功能)的是Decorator模式。這不完全是你想要的,但它可以讓你做你需要的。

0
class Party : class CFun 

(您party.cpp)

繼承CFUN的東西,包括你好()函數。

所以......

Party p; 
p.hello(); 

沒有?

2

這似乎是一個明顯的繼承用例。定義一個新類:

#include "CFun.hpp" 

class CFun2 : public CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

在你的源代碼,然後使用CFun2,而不是CFun

4

您可以重新定義類這樣的:

#define CFun CLessFun 
#include "CFun.hpp" 
#undef CFun 

class CFun : CLessFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

在一個新的頭文件CMoreFun.hpp將這個和包括代替CFun.hpp

相關問題