Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何设计/创建日历类_C++_Arrays_Class - Fatal编程技术网

C++ 如何设计/创建日历类

C++ 如何设计/创建日历类,c++,arrays,class,C++,Arrays,Class,当我的课程开始时,我希望它立即将从1875年1月1日到2025年12月31日的所有年/月/日填入“日历”类。我很难创建这个“日历”类,我真的不知道我的选择是什么C++。 实现这一点的最佳方式是什么?日/月/年是否为多重映射,如果是;我如何有效地使用多重贴图来实现我想要做的事情(多重贴图可以容纳2个以上的对象吗?)?或者这个类根本不应该是一个类,但是整个过程应该变成一个多重映射 我以这个“日历”项目为例,但我认为我的问题实际上可以归结为: “我如何设计一个类(或替代类),该类可以容纳链接且易于控

当我的课程开始时,我希望它立即将从1875年1月1日到2025年12月31日的所有年/月/日填入“日历”类。我很难创建这个“日历”类,我真的不知道我的选择是什么C++。

实现这一点的最佳方式是什么?日/月/年是否为多重映射,如果是;我如何有效地使用多重贴图来实现我想要做的事情(多重贴图可以容纳2个以上的对象吗?)?或者这个类根本不应该是一个类,但是整个过程应该变成一个多重映射

我以这个“日历”项目为例,但我认为我的问题实际上可以归结为: “我如何设计一个类(或替代类),该类可以容纳链接且易于控制/访问的多层数据”

“控制”是指添加/删除/检查是否已经存在等

所以可能是这样(忽略图片中的示例):

我想用这样的类通过编程实现的一个例子是:

//This is a magical GUI object I just made up ;D
myGUIofChoiceCreateSomeGUIobject GUIobject;
int i;
for(i=0; i < calendar.yearCount; i++;)
{
    GUIobject.addYeartoGUIobject(calendar.year[i]); //Add current year to our GUI. The user can now select it, hooray!
    addMonthsToYear(i); //Add months belonging to this year to our GUI.
}

addMonthsToYear(int theYear)
{
    int i;
    for(i=0; i < calendar.year[theYear].monthCount; i++;)
    {
        /*
        Our made-up GUI will add the current month to the year we received as an 
        argument. As long as that year is selected in the GUI, our user can pick this month, 
        hooray!
        */
        GUIobject.addMonthToGUIobject(calendar.year[theYear].month[i])
        addDaysToMonth(i,theYear) //Add days to this month (not typing this one down, you can see where this is going)
    }
}
之后,应该可以很容易地向类中添加这样的对象:

stuffToDo newstuff;
newstuff.message = "Find a C++ tutor so you can stop bothering stackoverflow";
newstuff.time = 15.20;

calendar.year[2012].month[11].day[18].addObject(newstuff);
我不知所措,我的选择是什么


PS.我为我的例子之间的不一致感到抱歉,但这是不可避免的,我不知道我应该做什么,这是这个问题的本质。

我认为你需要后退一步,清楚地思考你想做什么。关键的抽象是什么?您希望支持哪些操作和行动?写一篇关于系统使用的故事。在这个故事中,重要的名词通常变成C++代码中的对象,而重要的动词变成方法。 看起来您希望数据结构跨越多年,但基本对象是一天,它有一个数字,是一个任务容器,每个任务都有一条消息和一个与之相关的时间。然而,一天属于一个月和一年。现在,月份和年份可以是一天的简单属性,也可以是独立的完整对象(月份和年份)。在第二种方法中,月(也有名称)是天的容器,年(也有数字)是月的容器

如果年和月只是属性,那么您可能希望在主日历类中有一个将年映射到天的数据结构,以及一个将年和月组合映射到天的数据结构。如果使用对象持续数月和数年,那么在顶层,您将只有一个年份对象列表,或者可能有一个将年份编号映射到年份对象的地图。要到达某一天,只需从年数、月名和日数开始,然后在树中导航,直到到达该天为止,可能需要边走边创建对象

当然,如果您将基本对象设置为具有日、月和年属性的任务,那么所有这些可能会变得简单一些。这些将存储在一个映射中,其中键是年、月和日的序列化。如果地图真的是一个多重地图,那么每年/月/日的组合可以有多个任务。任务对象本身可以生成这个序列化键,这提供了良好的信息隐藏和解耦,尽管让类通过静态方法而不是特定对象生成它可能更灵活。此多重映射将成为日历对象的核心。它也是有效的,因为结构的总大小随着任务的数量而增长,而不是随着跨越的时间量而增长,前提是您可以在没有关联任务的情况下优雅地处理年/月/日组合的查找。要呈现日历,只需迭代年、月和日,并在日历中查找任务


所有这些都归结为一个事实,即您需要认真考虑您的数据模型。我发现,一旦找到一个好的数据模型,实际上对其进行编码几乎是微不足道的。没有一个清晰的数据模型会导致很多错误的开始和混乱的代码。看一下统一建模语言()符号,并用铅笔和纸画一些图片。我认为事情会变得更清楚。

Boost library是您需要了解的

为了帮助你自己,你可以找到 你想在这里上日历课吗
这是家庭作业吗?如果是这样的话,请在上面贴上家庭作业标签。日历并不容易。看看Boost.DateTime。@Cam无意冒犯,但为什么你会认为这是家庭作业?我甚至不在学校,所以。。不,“所有的年/月/日”几乎是不可能的困难,因为这取决于你指的是哪种日历。我猜你的意思是“公历”。但是你不能假设你的应用程序的用户自1875年以来所有日期都使用该日历(IIRC,Tzarist Russia从未使用过公历)。@Raedwald重点不是日历本身,我只是把它作为一个示例项目,因为它显示了我希望对象的数据(年->月->日->数组(或某些内容)如何链接。
struct stuffToDo{
    std::string message;
    float time;
}
stuffToDo newstuff;
newstuff.message = "Find a C++ tutor so you can stop bothering stackoverflow";
newstuff.time = 15.20;

calendar.year[2012].month[11].day[18].addObject(newstuff);