2016-11-21 5 views
0

Ich habe einen C++ - Code gemacht. Eine MList, die Elemente enthält. Ich habe den < Operator < überladen, um die Werte in MList in einem bestimmten Format zu drucken. Hier ist der Code:Operator Overloading Lösung

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; 
} 

Aber es druckt nicht korrekten Wert. Es druckt die Größe und Kapazität rechts, aber nicht die Werte. Anstelle von Werten, druckt es einige Zeichen wie Herz:

Here is the output.

Sie können sehen, es druckt Größe und Kapazität Recht, aber nicht die Werte. Hier ist der relevante Code. Mir Ausführung Fall 2 nur gerade jetzt:

#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; 
    } 
     // ... 
    } 
} 
+2

ich das nicht verwandten C-Tag entfernt. Bitte fügen Sie keine nicht verwandten Tags hinzu. Außerdem erfahren Sie, wie Sie ein [*** Minimales ***, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können. Schließlich sollten Sie lernen, wie Sie einen Debugger verwenden und wie Sie Ihren Code Zeile für Zeile durchgehen. –

+0

Ich habe den Debugger verwendet und den Code Zeile für Zeile ausgeführt und überprüft. Die Zeichenfolge im Debugger ist s = "Größe 1 \ nCap 2 \ n \ x3". Aber wenn es auf die Konsole druckt Statt 3 druckt es einige Symbole. Ich weiß es nicht. Ich kann den Wert 3 im Debugger sehen, aber wenn er mit String verkettet wird, fügt er \ x3 ein. –

Antwort

4

Du fügst die Werte in eine temporäre Zeichenfolge, die von dem Template-Typ implizite Konvertierungen beinhalten kann je (hier Ihre numerischen Werte wurden in Zeichen umgewandelt).

Drucken Sie einfach die Werte, ohne die temporäre Zeichenfolge:

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; 
} 
+0

Vielen Dank, mein Freund. Das hat mein Problem gelöst. Ich bin wirklich dankbar dafür. Und kannst du meinen Code überprüfen und mir sagen, ob ich eine gute Programmierpraxis gemacht habe oder nicht? Das wäre großartig. –