【问题标题】:Operator Overloading solution算子重载解决方案
【发布时间】:2016-11-21 09:32:44
【问题描述】:

我已经编写了一个 c++ 代码。一个包含项目的 MList。我重载了

friend ostream& operator<<(ostream &out, const MSet<V> &m)
{
    string s = "";
    s += "Size " + to_string(m.size_) + "\n";//out << m.size() << endl;
    s += "Cap " + to_string(m.capacity_) + "\n"; //out << m.capacity() << endl;
    for (int i = 0; i < m.size_; i++)
    {
        if (i < m.size_ - 1)
            s += m.ary[i].element + ",";//out << m.ary[i].element << ",";
        else
            s += m.ary[i].element;
    }
    //cout << "String : " << s;
    return out << s;
}

但它不会打印正确的值。它正确打印大小和容量,但不打印值。它打印的不是值,而是一些像心脏这样的符号:

您可以看到它正确打印大小和容量,但不打印值。这是相关的代码。我现在只执行案例 2:

#include<iostream>
using std::cout; using std::endl;
using std::ostream; using std::cin; using std::boolalpha;

#include<string>
using std::string;

using namespace std;

template <class V>
struct SetElement
{
    V element;
    int cnt;

    SetElement() = default;
    SetElement(V v) : element(v){}
};

template <class V>
ostream &operator<<(ostream & o,const SetElement<V> &p)
{
    return o << p.element;
}

template <class V>
class MSet
{
private:
    SetElement<V> *ary;
    size_t capacity_;
    size_t size_;

public:
    MSet(V val)
    {
        capacity_ = 2;
        ary = new SetElement<V>[capacity_];
        ary[0].element = val;
        ary[0].cnt = 1;
        size_ = 1;
    }

    SetElement<V>* find(V val)
    {
        SetElement<V> *found = nullptr;
        bool yes = false;
        for (int i = 0; i < size_ && !yes; i++)
        {
            if (ary[i].element == val)
            {

                found = &ary[i];
                yes = true;
            }
        }
        return found;
    }

    friend ostream& operator<<(ostream &out, const MSet<V> &m)
    {
        string s = "";
        s += "Size " + to_string(m.size_) + "\n";//out << m.size() << endl;
        s += "Cap " + to_string(m.capacity_) + "\n"; //out << m.capacity() << endl;
        for (int i = 0; i < m.size_; i++)
        {
            if (i < m.size_ - 1)
                s += m.ary[i].element + ",";//out << m.ary[i].element << ",";
            else
                s += m.ary[i].element;
        }
        //cout << "String : " << s;
        return out << s;
    }

};

int main(){
    int test;
    long l1, l2, l3;

    cin >> test;
    cout << boolalpha;

    switch (test){

        // ...
    case 2: {
        cin >> l1 >> l2;
        MSet<long> m_l(l1);
        auto p = m_l.find(l1);
        if (p != nullptr)
            cout << *p << endl;
        else
            cout << "Val:" << l1 << " not found " << endl;

        p = m_l.find(l2);
        if (p != nullptr)
            cout << *p << endl;
        else
            cout << "Val:" << l2 << " not found " << endl;
        //cout << "MList \n";
        cout << m_l;
        break;
    }
        // ...
    }
}

【问题讨论】:

  • 我删除了不相关的 C 标签。请不要添加不相关的标签。另请了解如何创建Minimal, Complete, and Verifiable Example。最后,您应该学习如何使用调试器,以及如何逐行执行代码。
  • 我已经使用了调试器并逐行执行和检查代码。它在调试器中显示的字符串是 s = "Size 1\nCap 2 \n\x3"。但是当它打印到控制台而不是 3 时,它会打印一些符号。我不知道。我可以在调试器中看到值 3,但是当它与字符串连接时,它会插入 \x3。

标签: c++ visual-studio pointers operator-overloading


【解决方案1】:

您正在将值添加到临时字符串中,这可能涉及隐式转换,具体取决于模板类型(此处您的数值已转换为字符)。

只打印值,没有临时字符串:

friend ostream& operator<<(ostream &out, const MSet<V> &m)
{
    out << "Size " << m.size_ << endl;
    out << "Cap " << m.capacity_ << endl;
    for (int i = 0; i < m.size_; i++)
    {
        if (i < m.size_ - 1)
            out << m.ary[i].element << ",";
        else
            out << m.ary[i].element;
    }
    return out;
}

【讨论】:

  • 非常感谢朋友。这解决了我的问题。我真的很感谢这一点。你能检查我的代码并告诉我我是否进行了良好的编码练习吗?那太好了。
猜你喜欢
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多