在C ++的子类中重载枚举 [英] Overloading an enum in a child class in c++
本文介绍了在C ++的子类中重载枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对定义要继承的通用类感兴趣,该通用类基于枚举和该枚举到某些数据结构的映射而有所不同。
I'm interested in defining a general class to be inherited that operates differently based on an enum and map of that enum to some data structure.
我具有test_child的代码继承自test_parent,该代码已实现了共享功能。我的计划是让许多类从类似parent_class的类继承,但要定义一个唯一的字段枚举和相应的映射映射。
In the following code I have test_child inherit from test_parent, which has the shared functions already implemented. My plan would be to have many classes inherit from a class like parent_class, but to define a unique 'field' enum and corresponding 'mapping' map.
#include <iostream>
#include <string>
#include <unordered_map>
class test_parent {
public:
enum class field {
A,
B,
C
};
typedef struct {
std::string s;
int i, j;
} data_t;
std::unordered_map<field, data_t> mapping {
{field::A, {"A", 1, 1}},
{field::B, {"B", 2, 2}},
{field::C, {"C", 3, 3}}
};
int get_i (field f) {
return mapping[f].i;
}
std::string get_s (field f) {
return mapping[f].s;
}
};
class test_child : test_parent {
public:
enum class field {
D,
E
};
std::unordered_map<field, data_t> mapping {
{field::D, {"D", 4, 4}},
{field::E, {"E", 5, 5}}
};
};
int main () {
test_parent tp;
test_child tc;
std::cout << tp.get_i(test_parent::field::A) << " " << tc.get_i(test_child::field::E) << std::endl;
return 0;
}
此代码返回编译错误:
test.cpp: In function ‘int main()’:
test.cpp:55:86: error: no matching function for call to ‘test_child::get_i(test_child::field)’
std::cout << tp.get_i(test_parent::field::A) << " " << tc.get_i(test_child::field::E) << std::endl;
^
test.cpp:28:6: note: candidate: int test_parent::get_i(test_parent::field)
int get_i (field f) {
^~~~~
test.cpp:28:6: note: no known conversion for argument 1 from ‘test_child::field’ to ‘test_parent::field’
但是我希望打印的是:
1 5
推荐答案
不确定是不是您想要的,但是带有模板,您可以这样做
Not sure it is what you want, but with template, you might do
struct data_t
{
std::string s;
int i;
int j;
};
template <typename E>
class test_parent {
public:
int get_i(E e) const { return mapping.at(e).i; }
const std::string& get_s(E e) const { return mapping.at(e).s; }
static const std::unordered_map<E, data_t> mapping;
};
然后
enum class field_ABC{ A, B, C };
enum class field_DE{ D, E };
template <>
const std::unordered_map<field_ABC , data_t> test_parent<field_ABC >::mapping = {
{field_ABC::A, {"A", 1, 1}},
{field_ABC::B, {"B", 2, 2}},
{field_ABC::C, {"C", 3, 3}}
};
template <>
const std::unordered_map<field_DE, data_t> test_parent<field_DE>::mapping = {
{field_DE::D, {"D", 4, 4}},
{field_DE::E, {"E", 5, 5}}
};
这篇关于在C ++的子类中重载枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文