c++将方法添加到头文件中定义的类中
c++ adding method to class defined in header file
我想知道是否可以将主程序中的方法添加到头文件中定义的现有类中。例如:文件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();
没有?
- 告诉CMake链接到自定义文件夹中的Boost
- 通过cMake使用具有自定义文件扩展名的共享库
- 威纳派读取自定义文件或文件夹的所有访问权限
- 使用命令列表解析自定义文件
- 单独的类声明和方法定义文件问题
- Qt解析自定义文件格式
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- FAT32和NTF中的自定义文件属性
- 如何在没有"fatal error: Wt/WApplication: No such file or directory"的情况下将wt安装到自定义文件夹中
- C++ while 循环在自定义文件结构中
- QT C 读取自定义文件结构
- gcc 是否有编译指示来定义文件类型/编译器
- C/C++ 中的跨平台自定义文件头
- 使用头文件和类定义文件时未解决的外部符号错误
- 将此c++代码分解为单独的类规范文件和函数定义文件
- 自定义文件类中fstream对象的生存期
- 如何使用BinaryReader类使用C#读取自定义文件(C++)
- 提供带有libjpeg的自定义文件IO
- C++模块定义文件头内联符号
- 错误:未定义文件中的第一个引用符号