【问题标题】:c++ adding method to class defined in header filec ++将方法添加到头文件中定义的类
【发布时间】:2010-09-19 21:39:15
【问题描述】:

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

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

【问题讨论】:

    标签: c++ file class header methods


    【解决方案1】:

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

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

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

    【讨论】:

    • 你应该告诉他函数需要和类在同一个命名空间中。否则只是调用 Hello(some_cfun);找不到你好。你必须写 foo::Hello(some_cfun);然后(ADT 将无法工作)
    【解决方案2】:

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

    #define CFun CLessFun
    #include "CFun.hpp"
    #undef CFun
    
    class CFun : CLessFun
    {
       public:
        void hello() {cout << "hello" << endl;};
    };
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            仔细考虑之后,你可能会做一些可怕的事情:在 CFun 中找到一些函数,它具有你想要的返回类型,并且在整个标题中只提到一次。假设void GoodBye()

            现在创建一个包含以下内容的文件 CFunWrapper.hpp:

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

            然后只包含 CFunWrapper.hpp 而不是 CFun.hpp。

            但不要这样做,除非有非常好的理由这样做。根据 CFun.hpp 的内容,它非常容易损坏,甚至可能无法实现。

            【讨论】:

            • 这样做和修改CFun.hpp是一样的。很难想象这种情况会起作用,但是您不能只更改头文件。我猜它可能在 ROFS 上。
            【解决方案7】:

            据我所知。虽然,你可以做一些陪审团操纵并制定一个命名空间的解决方案。

            【讨论】:

              【解决方案8】:
              class Party : class CFun
              

              (你的派对.cpp)

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

              所以...

              Party p;
              p.hello();
              

              没有?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-04-03
                • 1970-01-01
                • 1970-01-01
                • 2011-01-10
                • 1970-01-01
                • 1970-01-01
                • 2013-09-21
                • 2021-06-11
                相关资源
                最近更新 更多