gpt4 book ai didi

c++ - 运算符重载解决方案

转载 作者:行者123 更新时间:2023-11-27 22:48:19 25 4
gpt4 key购买 nike

我做了一个c++代码。一个包含项目的 MList。我重载了 << 运算符以以特定格式打印 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;
}

但是它没有打印出正确的值。它正确打印大小和容量,但不打印值。它打印的不是值,而是一些符号,例如心形:

Here is the output.

您可以看到它正确打印了大小和容量,但没有打印值。这是相关代码。我现在只执行案例 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;
}
// ...
}
}

最佳答案

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

只打印值,不带临时字符串:

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

关于c++ - 运算符重载解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40716825/

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