我想知道是否可以将主程序中的方法添加到头文件中定义的现有类中。例如:文件CFun.hpp
中定义了class CFun
,但在我们的party.cpp
中,我们希望添加一个方法void hello() {cout << "hello" << endl;};
而不编辑CFun.hpp
显然(不幸的是)建设:
#include "CFun.hpp"
class CFun
{
public:
void hello() {cout << "hello" << endl;};
};
返回错误Multiple declaration for 'CFun'
无效
是否可以在没有类继承的情况下使其工作?
没有,但您可以添加一个引用/指针到CFun类的方法-您将无法访问私有数据:
void Hello(CFun &fun)
{
cout << "hello" << endl;
}
这可能是你能做的最好的事情。正如litb所指出的,这个函数必须与CFun在同一个命名空间中。幸运的是,与类不同,命名空间可以在多个位置添加到。
您可以这样重新定义类:
#define CFun CLessFun
#include "CFun.hpp"
#undef CFun
class CFun : CLessFun
{
public:
void hello() {cout << "hello" << endl;};
};
将其放在一个新的头文件CMoreFun.hpp
中,并包括它而不是CFun.hpp
不,这是不可能的。任何特定类只能有一个定义,并且必须是一个完整的定义,这意味着不能在不同的地方有部分定义,从而向类中添加成员。
如果需要向类添加成员函数,则必须更改类定义(编辑CFun.hpp),或者从CFun
派生一个新类并将hello()
放在那里。
在C++中,与这种构造(向预定义类添加功能)最相似的是Decorator模式。这并不完全是你想要的,但它可能会让你做你需要的事情。
这似乎是一个明显的继承用例。定义一个新类:
#include "CFun.hpp"
class CFun2 : public CFun
{
public:
void hello() {cout << "hello" << endl;};
};
然后在源代码中使用CFun2
而不是CFun
。
仔细想想,你可能会做一些可怕的事情:在CFun中找到一些具有你想要的返回类型的函数,并且在整个头中只提到一次。比方说void GoodBye()
。
现在创建一个包含以下内容的文件CFunWrapper.hpp:
#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye
然后只包含CFunWrapper.hpp而不是CFun.hpp.
但是,除非有充分的理由,否则不要这样做。它极易损坏,甚至可能不可能,这取决于CFun.hpp.
据我所知。不过,你可以做一些陪审团操纵,并制定一个同名的解决方案。
class Party : class CFun
(你的政党.cpp)
继承CFun的东西,包括hello()函数。
所以。。。
Party p;
p.hello();
没有?