在 C++ 中扩展内置类

     2023-02-22     62

关键词:

【中文标题】在 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。

此外,您应该强烈避免使用&lt;bits/stdc++.h&gt;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... 查看详情