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