关键词:
【中文标题】在 C++ 中扩展内置类【英文标题】:Extending built-in classes in C++ 【发布时间】:2021-09-06 14:15:51 【问题描述】:我知道已被弃用,但出于某些原因我仍然想这样做。
我想将我的自定义方法添加到从 std::string
类扩展/继承的类 (str
)(这是一个示例)
但是当我这样做时,我会遇到一些问题,例如 std::string
类中已经存在的方法(内置方法),
#include <bits/stdc++.h>
using namespace std;
class str : public string
public:
string s;
str(string s1)
s = s1; //ig the problem is here
;
int main()
str s("hello world");
cout << s.size(); //prints out 0 not 11 => length of "hello world"
我该如何解决这个问题?
【问题讨论】:
您正在混合组合和继承。选一个。对于继承,你应该去掉string s;
成员。
@Yksisarvinen 你能解释一下继承吗?
请注意,很少有标准类被设计为公开继承,因为它们没有virtual
析构函数。这意味着你不能多态地使用它们。
私有继承与组合基本相同,所以就用组合吧。如果您觉得需要从标准容器继承,那么您应该将其视为您的设计存在缺陷的标志。
关于坏习惯,习惯(好和坏)往往会坚持下去。所以最好开始在任何地方都养成良好的习惯并坚持下去?
【参考方案1】:
std::string
不知道您的string s;
成员。它不可能在其方法中使用它。如果你想使用继承而不是组合,你需要使用std::string
的公共接口下可用的任何东西——在这种情况下,是它的构造函数。
class str : public string
public:
str(string s1): string(s1) //initialize base class using its constructor
;
// or
class str : public string
public:
using string::string; //bring all std::string constructors into your class
;
作为脚注,从标准容器继承并没有被弃用,但它们并不是为此而生的,您只能安全地做非常有限的一组事情。例如,这是未定义的行为:
std::string* s = new str("asdf");
delete s; // UB!
更详细的解释见this question。
此外,您应该强烈避免使用<bits/stdc++.h>
和using namespace std;
,尤其是不要混合使用它们。你会剥夺自己几乎所有的名字,这会产生很难找到的错误。
【讨论】:
你能给出一个关于构图的解决方案吗? @MasterCoderxD 对于组合,您从string s;
成员开始,并在您自己的类中编写将调用该成员方法的方法。例如。 str::size()return s.size();
。请注意,std::basic_string
有上百种方法,因此如果您想将其行为复制到字母上,那将是不可行的。
链接问题中关于代码 sn-p 是 UB 的部分在哪里?如果子类需要自己的析构函数,我可以看到问题,但因为它不需要我不明白 UB 来自哪里。
Alr Imma 使用继承,ty bruv
@Voo 接受的答案链接到此处:isocpp.org/wiki/faq/virtual-functions#virtual-dtors“技术术语是,“糟糕”。”;)用c或c++扩展(翻译)(代码片段)
用C或C++扩展如果你知道如何用C语言编程,那么为Python添加新的内置模块是很容易的。这种扩展模块可以做两件不能直接在Python中完成的事情:它们可以实现新的内置对象类型,以及调用C库函数和系统调用。为了支持扩展,Python... 查看详情
如何使用 void `null` 或 `empty` 类元素扩展 C++ 结构/类
】如何使用void`null`或`empty`类元素扩展C++结构/类【英文标题】:HowtoextendaC++structure/classwithavoid`null`or`empty`likeelement【发布时间】:2019-07-0323:50:48【问题描述】:我在学习C++时正在实现一个国际象棋模块。在我已经(部分)实现的... 查看详情
无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)
...:我想将C++类导出到Python,为此我使用SWIG创建了一个C++扩展模块。从文档中,我可以看到可以使用SWIG导出类。我能够成功地为python创建类模块(_minim 查看详情
在 C++ 中使用闭包改变行为
...】:我有一个基类和一个闭包,基类总是被一个特定的类扩展,但它不确定基类具体包含什么。现在我想在改变特定类的行为的同时覆盖基类的行为。这是我想要实现的一个简单示例:classbasepublic:inlinevoidprint()std::cout<<"te 查看详情
c++(非内置/类)静态成员
】c++(非内置/类)静态成员【英文标题】:c++(non-builtin/class)staticmember【发布时间】:2010-10-1512:16:27【问题描述】:#include<iostream>#include<string>classc1public:staticstd::stringm1;staticunsignedintm2;;//std::stringc1::m1=std::string 查看详情
为 C++ 模板扩展 C# 代理类
】为C++模板扩展C#代理类【英文标题】:ExtendC#ProxyClassforaC++template【发布时间】:2016-09-1614:29:07【问题描述】:TLDR:如何在C#中为SWIG访问模板类型“T”?假设我在C++中有以下带有Validate函数的模板类:template<typenameT>structMyTem... 查看详情
向其他文件中的现有 C++ 类添加方法
...417:22:41【问题描述】:是否可以在C++中在不同的源文件中扩展一个类(添加一个方法),而无需编辑编写该类的原始源文件?在obj-c中可以写另一个@interfaceAbcClass(ExtCategory)...@end当我尝试这样的事情时遇到编译时错误://Abc.hc 查看详情
在 C++ 上使用 CImg 类显示多个图像
...【问题讨论】:模板图像处理工具包的CImg?VisualC++已经内置了用于图像显示的函数,例如CBit 查看详情
使用 cuda 的 cython 扩展
】使用cuda的cython扩展【英文标题】:cythonextensionsusingcuda【发布时间】:2014-06-0422:08:46【问题描述】:我有一个作为C++类的convnet实现。该类构建在生成CUDA代码的模板库(mshadow)之上,因此它采用头文件的形式。因此,它只能在使... 查看详情
在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?
】在VisualStudio2019C++中,如何扩展动态分配的数组以显示其所有元素?【英文标题】:InVisualStudio2019C++,howcanIexpandadynamicallyallocatedarraysothatallofitselementsaredisplayed?【发布时间】:2020-04-0908:39:46【问题描述】:我为向量类编写了一个... 查看详情
传递指向在 C++ 中动态定义的内置类型的指针
】传递指向在C++中动态定义的内置类型的指针【英文标题】:passingapointertoabuilt-intypedefinedontheflyinc++【发布时间】:2015-06-2822:56:22【问题描述】:我想调用一个库的函数(我不能修改)voidfunction(int*i,char*c);有没有办法即时调用定... 查看详情
如何在 c++ 构造函数初始化程序列表中初始化非内置类型的数组?
】如何在c++构造函数初始化程序列表中初始化非内置类型的数组?【英文标题】:HowdoIinitializeanarrayofanon-built-intypeinac++constructorinitializerlist?【发布时间】:2017-12-0722:27:20【问题描述】:在C++中,我试图在构造函数初始化程序列表... 查看详情
c++继承是如何工作的?
...ivate属性;基类中的所有private成员在派生类中不能使用。扩展资料:通过C++继承方式可以发现:1、基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为protected时,那么基类成员在派生类中的访... 查看详情
在 C++ 中扩展 OpenCV mat 对象的尺寸
】在C++中扩展OpenCVmat对象的尺寸【英文标题】:ExpanddimensionsforOpenCVmatobjectinC++【发布时间】:2020-09-2703:57:19【问题描述】:我的tensorflow模型期望图像具有以下形状:[1,512,512,1],我正在尝试在C++中扩展图像帧的尺寸。在Python中,... 查看详情
Loopback - 扩展内置模型的最简单方法
】Loopback-扩展内置模型的最简单方法【英文标题】:Loopback-Easiestwaytoextendabuilt-inmodel【发布时间】:2015-04-0812:03:25【问题描述】:我一直在使用Loopback创建API。该文档通常非常好,但并没有真正回答我关于以下问题的问题:我如... 查看详情
如何在 C++ 中编写 shell 扩展?
】如何在C++中编写shell扩展?【英文标题】:HowtowriteashellextensioninC++?【发布时间】:2012-02-0708:34:35【问题描述】:这似乎是一个常见问题,但在进行了一些搜索后,我并没有真正找到答案。这里有一篇文章:http://www.codeproject.com/... 查看详情
Cython 中的 C++ 指针
...ame可能是一些已经在pxd和pyx文件中描述的复杂类(就像在扩展答案https://***.com/a/39116733/4881441中提到的一样)。但是Cython在pyxdefs中说我返回的 查看详情
C++:在子类中扩展静态 STL 容器/映射成员?
】C++:在子类中扩展静态STL容器/映射成员?【英文标题】:C++:ExtendingstaticSTLcontainer/mapmemberinsubclass?【发布时间】:2020-06-0321:09:49【问题描述】:目前我的代码看起来很像#include<map>#include<string>#include<functional>voidSomeF... 查看详情