我想知道是否可以将主程序中的方法添加到头文件中定义的现有类中。 例如: 在文件class CFun中定义CFun.hpp,但在我们的party.cpp中,我们要添加方法void hello() {cout << "hello" << endl;};而不编辑Multiple declaration for 'CFun'

显然(不幸的是)建筑:

#include "CFun.hpp"

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

无法返回错误<=>

是否可以在没有类继承的情况下使其工作?

有帮助吗?

解决方案

不,但是你可以添加一个方法来获取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

(你的party.cpp)

继承CFun的东西,包括hello()函数。

因此...

Party p;
p.hello();

没有

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top