C ++:派生类中具有特定类型的通用基本成员函数

马特·亚当斯

很快就会发现,我仍在学习C ++。
对于我正在处理的问题,我有一个类,它具有std :: map数据成员和一些在地图上运行的成员函数。我将需要一些实例,这些实例的地图以升序排序,而另一些实例则以地图的降序排序。两种情况下成员函数的代码都是相同的(类型问题除外,据我所知,为地图更改Compare函数会更改其类型)。我正在努力做到这一点,而不必为每种情况重写函数。

这是一些玩具代码,我希望可以说明我的情况(为紧凑起见,内联函数):

class MyClass {
public:
    map<int, int>::iterator get_top(){ return data.begin(); }
    int sum_elements(){ 
        int sum = 0;
        for ( map<int,int>::iterator it = data.begin(); it != data.end(); ++it){
            sum += it->second;
        }
    }
};

理想情况下,我将有一个定义函数的基类和两个定义数据成员的派生类,一个用于升序,一个用于降序:

class Ascending : public MyClass {
private:
    std::map<int, int, std::less<int> > data;
};
class Descending : public MyClass {
private:
    std::map<int, int, std::greater<int> > data;
};

但是,这当然不起作用,因为基类需要定义数据成员才能对其进行操作。“简便”的解决方法是拥有两个独立的类,然后将成员函数复制/粘贴到这两个函数中。但这将是浪费的,而且我内心感到C ++必须能够很好地解决我的问题。

虚拟软件公司

定义一个重载operator()(int, int)(比较)函子,并将要对元素进行排序的顺序作为构造函数。这样,您可以将地图定义为std::map<int, int, SortCriterion> data(comp),其中comp定义SortCriterion comp(true)为例如升序和SortCriterion comp(false)降序。这样,两个地图将具有相同的类型map<int, int, SortingCriterion>

代码如下:

#include <map>
#include <iostream>

using namespace std;

class SortCriterion
{
    bool ascending;
public:
    SortCriterion(bool sorting_type): ascending(sorting_type){};
    bool operator()(int x, int y) const
    // if not marked const, 
    // clang++ spits a compile-time error on insert
    // however g++ compiles it ok
    {
        if(ascending) // ascending
            return x<y;
        else
            return x>y;
    }
};

int main()
{
    // Both maps below have the SAME type, map<int, int, SortCriterion>
    map<int, int, SortCriterion> m1(SortCriterion(true)); // ascending
    map<int, int, SortCriterion> m2(SortCriterion(false)); // descending


    m1.insert({1,1});
    m1.insert({2,2});

    m2.insert({1,1});
    m2.insert({2,2});

    cout << "First map:" << endl;
    for(auto elem: m1)
        cout << "[" << elem.first << "," << elem.second\
             << "]" << endl;

    cout << endl << "Second map:" << endl;
    for(auto elem: m2)
        cout << "[" << elem.first << "," << elem.second\
             << "]" << endl;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:如何强制派生类设置基本成员变量?

来自分类Dev

从基类继承的C ++公共方法无法访问派生类中的私有成员变量

来自分类Dev

具有派生类的C ++模板

来自分类Dev

在Fortran派生类型中持有指向C函数的指针

来自分类Dev

访问派生类C ++的私有成员

来自分类Dev

派生类的C ++ CRTP构造函数

来自分类Dev

C ++-具有派生类的“安全/标准”方法“继承”基类中的重载赋值运算符

来自分类Dev

C ++ 11在派生类中删除的析构函数

来自分类Dev

C ++:在派生类成员上调用基类方法

来自分类Dev

C ++将派生类的const值传递给基本意外行为的构造函数

来自分类Dev

返回派生类型的基类中的C#方法

来自分类Dev

为具有TypeScript中类型变量的抽象类的派生类分配通用类型

来自分类Dev

C#如何从基类的派生类中获取特定类型的所有字段?

来自分类Dev

C ++-派生类构造函数的行为

来自分类Dev

C ++ | 派生类正在访问基类的私有成员,而不是其自己的私有成员

来自分类Dev

C ++-在派生类中静态初始化基类保护的成员变量

来自分类Dev

C ++派生类仅使用继承的基本构造函数的一部分

来自分类Dev

基类的C ++数组,具有存储在数组元素中的派生类的实例

来自分类Dev

在Fortran派生类型中持有指向C函数的指针

来自分类Dev

在C ++中,如何访问基本函数中派生类的成员?(这甚至是正确的做法吗?)

来自分类Dev

C ++:用指向派生类的指针进行的虚函数调用是否仍具有vlookup

来自分类Dev

访问派生类C ++的私有成员

来自分类Dev

当派生类添加了数据成员时,派生类的构造函数应该如何像c ++中那样

来自分类Dev

在派生类中重写C ++模板函数

来自分类Dev

重写派生类C ++中基类私有成员的行为

来自分类Dev

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

来自分类Dev

错误C2509:未在派生类中声明成员函数

来自分类Dev

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

来自分类Dev

访问派生类 C++ 中的受保护成员

Related 相关文章

  1. 1

    C ++:如何强制派生类设置基本成员变量?

  2. 2

    从基类继承的C ++公共方法无法访问派生类中的私有成员变量

  3. 3

    具有派生类的C ++模板

  4. 4

    在Fortran派生类型中持有指向C函数的指针

  5. 5

    访问派生类C ++的私有成员

  6. 6

    派生类的C ++ CRTP构造函数

  7. 7

    C ++-具有派生类的“安全/标准”方法“继承”基类中的重载赋值运算符

  8. 8

    C ++ 11在派生类中删除的析构函数

  9. 9

    C ++:在派生类成员上调用基类方法

  10. 10

    C ++将派生类的const值传递给基本意外行为的构造函数

  11. 11

    返回派生类型的基类中的C#方法

  12. 12

    为具有TypeScript中类型变量的抽象类的派生类分配通用类型

  13. 13

    C#如何从基类的派生类中获取特定类型的所有字段?

  14. 14

    C ++-派生类构造函数的行为

  15. 15

    C ++ | 派生类正在访问基类的私有成员,而不是其自己的私有成员

  16. 16

    C ++-在派生类中静态初始化基类保护的成员变量

  17. 17

    C ++派生类仅使用继承的基本构造函数的一部分

  18. 18

    基类的C ++数组,具有存储在数组元素中的派生类的实例

  19. 19

    在Fortran派生类型中持有指向C函数的指针

  20. 20

    在C ++中,如何访问基本函数中派生类的成员?(这甚至是正确的做法吗?)

  21. 21

    C ++:用指向派生类的指针进行的虚函数调用是否仍具有vlookup

  22. 22

    访问派生类C ++的私有成员

  23. 23

    当派生类添加了数据成员时,派生类的构造函数应该如何像c ++中那样

  24. 24

    在派生类中重写C ++模板函数

  25. 25

    重写派生类C ++中基类私有成员的行为

  26. 26

    如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

  27. 27

    错误C2509:未在派生类中声明成员函数

  28. 28

    如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

  29. 29

    访问派生类 C++ 中的受保护成员

热门标签

归档