gpt4 book ai didi

C++:多态类模板

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:52 26 4
gpt4 key购买 nike

考虑一个存储一堆 Date 对象的 Calendar 类。日历旨在保存从 Date 继承的任何类型的对象的集合。我认为最好的方法是拥有一个类模板,例如

template<typename D> class Calendar{ 
...
}

但令我震惊的是,D 现在实际上可以是任何类。我现在的问题是,如何确保 D 是日期对象的子类?

我知道如何在 Java 中执行此操作,但我仍然不熟悉 C++ 语法。这个问题与某些集合如何只能采用实现 Comparable 的模板变量非常相似。然后标题看起来像

public class Calendar<D extends Date>{
...
}

--------------------编辑:------------------------ ------------------

模板参数定义日历所指的实际日期。不同的日期类型引用不同格式的同一天。例如,如果我制作 Calendar<Gregorian>它将能够在另一个 Date 中获取日期格式,比如儒略历,或任何其他日期格式,并以公历格式显示它们。这允许在不同日期格式的日历之间进行转换。所以,如果我有一个 Calendar<Gregorian>我可以很容易地将它转换成 Calendar<Julian> .那么以下是可能的:

Calendar<Gregorian> cal;
std::cout << "These events are entered as dates in
the Gregorian calendar" << std::endl;
cal.add_event("Christmas", 12, 25);
cal.add_event("Gregorian new year", 1, 1);
std::cout << cal << std::endl;
std::cout << "----" << std::endl;
std::cout << "And printed out as Julian dates" << std::endl;
Calendar<Julian>(cal);
std::cout << cal<< std::endl;

和输出:

These events are entered as dates in the Gregorian calendar
2009-12-25 Christmas
2010-01-01 Gregorian new year
----
And printed out as Julian dates
2009-12-13 Christmas
2009-12-19 Gregorian new year

------------ 新编辑:--------------------

最后的编辑现在更有意义了。我对格式略有异议。

谢谢大家的回答。

我是一名计算机科学专业的大三学生,我想说我对 OO 和相关概念(如多态性等)相当熟悉。这篇文章的目的是找出是否有一种方法在 C++ 中以与在 Java 中相同的方式表达模板参数的条件,并以简洁、优雅和直观的方式解决问题。

最佳答案

I know how to do this is Java, but I'm still unfamiliar with the C++ syntax. The problem is very much similar to how some collections can only take a template variables that implement Comparable. The header would then look something like

public class Calendar<D extends Date>{
...
}

没错,是同一个问题,在C++中,通常忽略它就解决了。为什么我们需要强制对象必须实现IComparable?在 Java 中,这是必要的,因为它的贫血类型系统。没有这个约束,我们将无法比较对象。

在 C++ 中,规则不同。容器只是尝试比较它们存储的对象,如果类型不支持,就会出现编译错误。不需要接口(interface)或继承。

您通常会在 Calendar 类中执行相同的操作。只需不强制“必须子类化形式 Date”约束。

相反,指定类型必须公开的成员,以及应该从他们那里获得什么语义(如果有的话)。

例如,如果您的日历尝试对日期对象 d0d1 执行以下操作:

d0.getDay();
d0.getTime();
Time t = d0 - d1;

那么就是应该支持的操作了。任何支持这些操作的类都是一个有效的 Date 类,即使它不是任何的子类也是如此。

关于C++:多态类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com