13

我想知道是否可以将主程序中的方法添加到头文件中定义的现有类中。例如: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'

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

4

8 回答 8

10

不,但是您可以添加一个方法来获取 CFun 类的引用/指针 - 您只是无法访问私有数据:

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

这可能是你能做到的最好的。正如 litb 所指出的 - 此函数必须与 CFun 位于相同的命名空间中。幸运的是,与类不同,命名空间可以添加到多个位置。

于 2008-10-29T22:20:44.627 回答
5

您可以像这样重新定义类:

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

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

把它放在一个新的头文件中CMoreFun.hpp并包含它而不是CFun.hpp

于 2013-01-21T09:35:13.483 回答
3

不,那是不可能的。任何特定类只能有一个定义,并且必须是完整的定义,这意味着您不能在不同的地方有部分定义,向类添加成员。

如果您需要将成员函数添加到类中,那么您必须更改类定义(编辑 CFun.hpp),或者从中派生一个新类CFun并将其放在hello()那里。

于 2008-10-29T22:20:49.617 回答
2

与 C++ 中这种构造(向预定义类添加功能)最接近的类似物是装饰器模式。这不完全是你所追求的,但它可能会让你做你需要的事情。

于 2008-10-29T22:33:38.390 回答
2

这似乎是一个明显的继承用例。定义一个新类:

#include "CFun.hpp"

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

然后在源代码中使用CFun2而不是。CFun

于 2011-09-15T14:24:15.770 回答
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 的内容,它非常容易损坏,甚至可能不可能。

于 2008-10-29T22:30:55.260 回答
0

据我所知不是。虽然,您可以进行某种陪审团操纵并制定命名空间解决方案。

于 2008-10-29T22:12:39.760 回答
0
class Party : class CFun

(你的派对.cpp)

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

所以...

Party p;
p.hello();

不?

于 2008-11-28T01:26:56.537 回答