【问题标题】:Printing an object after putting it into a map [closed]将对象放入地图后打印对象[关闭]
【发布时间】:2020-01-10 17:17:10
【问题描述】:
class Task
{


public:
    string study;
    int time;
    bool made;
    int priority;
}
class Day 
{
    public:
        string date = "undefined";
        int aims = 0;
        vector <Task> tasks;
}

我有 2 个类,我使用向量来保存两者的数据。 这个项目是一天的每日计划。 现在我需要改进它以存储更多天数,导师希望我使用 MAP。

map<string, Day>Days;
map<string, Day>::iterator it;
            Days.insert(pair<string, Day>(s, d));
            for (it = Days.begin(); it != Days.end(); ++it)
            {
                cout << it->first << " " << it->second << '\n';
            }

E0349 缺少与这些操作数对应的运算符“

void PrintDay(const Day& d, ChangeF Pd)
{
    cout << "Current date:" << d.date << endl << "\n=============================================" << endl << "Number of tasks:" << d.aims;
    cout << "\n=============================================" << endl;
    for (int i = 0; i < d.aims; i++)
    {
        PrintTask(d.tasks[i], Pd);
    }
}

Day InputDay()
{
    setlocale(LC_ALL, "Russian");
    Day d;
    cout << "\nEnter date dd ENTER mm ENTER yyyy ENTER obe by one" << endl;
    int dd, mm, yyyy;
    dd = DigitInputCheck(1, 30);
    mm = DigitInputCheck(1, 12);
    yyyy = DigitInputCheck(0, 4000);
    ostringstream WriteDate;
    WriteDate << dd << "." << mm << "." << yyyy << endl;
    d.date = WriteDate.str();
    cout << "Number of tasks:" << endl;
    cin >> d.aims;
    for (int i = 0; i < d.aims; i++)
    {
        d.tasks.push_back(InputTask());
    }

    return d;

}

【问题讨论】:

  • 错误信息非常清楚:你没有为Day类型重载operator&lt;&lt;,所以你不能打印它
  • 我会在地图中使用时间作为键
  • “打印”Day 的代码在哪里?这与切换到地图无关。
  • @CruzJean 怎么办?对不起,我是这个领域的菜鸟
  • 需要定义函数std::ostream &amp;operator&lt;&lt;( std::ostream &amp;os, const Day &amp;day );

标签: c++ dictionary


【解决方案1】:

如 cmets 中所述,如果您要尝试使用 &lt;&lt; 类型,则需要为 Day 类型重载 operator&lt;&lt;。由于您已经有一个PrintDay,我将对其进行调整以与操作员一起使用。我不知道Pd 应该是什么,所以我忽略了它。这个函数应该是一个全局函数。由于您的所有字段都是公开的,因此也不需要通过 friend 进行特殊访问。

std::ostream &operator<<( std::ostream &os, const Day &day ) {
    os << "Current date:" << d.date << '\n'
        << "\n=============================================\n"
        << "Number of tasks:" << d.aims
        << "\n=============================================\n";
    for (int i = 0; i < d.aims; i++)
    {
        os << d.tasks[i];
    }
}

您还需要为您的Task 类型添加运算符。鉴于上述情况,您应该能够为您的 PrintTask 函数创建另一个函数。

【讨论】:

  • ostream&amp; operator&lt;&lt;(ostream&amp; ost, const Task&amp; t) { ChangeF Pt; Day d; ost &lt;&lt; t.study &lt;&lt; t.priority; string stime = Pt(t.time); ost &lt;&lt; stime &lt;&lt; endl &lt;&lt; t.made &lt;&lt; endl; }
  • ostream&amp; operator&lt;&lt;(ostream&amp; os, const Day&amp; d) { ChangeF Pd; os &lt;&lt; "Current date:" &lt;&lt; d.date &lt;&lt; endl &lt;&lt; "\n=============================================" &lt;&lt; endl &lt;&lt; "Number of tasks:" &lt;&lt; d.aims &lt;&lt; "\n=============================================" &lt;&lt; endl; for (int i = 0; i &lt; d.aims; i++) { os &lt;&lt; d.date &lt;&lt; endl &lt;&lt; d.aims;; } }
  • @aigoo038 你为什么在 cmets 中发送垃圾代码?它不可读...
  • 我是这样弄的,但还是不明白我在做什么
  • @aigoo038 如果您想要求澄清,那就问吧。如果您有后续问题,则可以打开一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2018-01-15
  • 2012-11-08
相关资源
最近更新 更多