马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小易zjy 于 2021-11-28 19:30 编辑
等号处报错,但我觉着赋值运算符重载没问题啊,两边都是同样类型的,有大佬知道原因嘛(main.cpp的55行报错)
//Seqlist.h#pragma once
#ifndef SEQLIST_H
#define SEQLIST_H
#include <iostream>
#include <cstdlib>
#include <cassert>
#include<string>
using namespace std;
const int defaultSize = 100;
template <typename T>class SeqList {
friend string multiply(string num1, string num2);
friend SeqList<T> mul(const SeqList<T> & list1,const SeqList<T> &list2);
protected:
T* data;//存放数组
int maxSize;//最大可容纳表项的项数
int last;//当前已存表项的最后位置(从0开始)
public:
SeqList(int sz = defaultSize);//构造函数
SeqList(SeqList<T>& L);//复制构造函数
~SeqList() {
delete[]data;
}
void reSize(int newSize);
int Size() const {
return maxSize;
}
int Length()const {
return last + 1;
}
int Search(T& x) const;
int Locate(int i) const;
bool getData(int i, T& x) const {//改
if (i > 0 && i <= last + 1) {
x = data[i - 1];
return true;
}
else return false;
}
void setData(int i, T& x) {
if (i > 0 && i <= last + 1) {
data[i - 1] = x;
}
}
bool Insert(int i, T& x);
bool Remove(int i, T& x);
bool IsEmpty() {
return (last == -1);
}
bool IsFull() {
return (last == maxSize - 1);
}
void Sort();
void input();
void output();
SeqList<T> operator = (SeqList<T>& L);
friend istream& operator >> (istream& in, SeqList<T>& R) {
R.last = -1;//先清空
while (!in.eof()) {
R.last++;
if (R.last == R.maxSize) R.reSize(2 * R.maxSize);
assert(in >> R.data[R.last]);
}
return in;
}
friend ostream& operator << (ostream& out, SeqList<T>& R) {
for (int i = 0; i <= R.last; i++) {
cout << "#" << i + 1 << ":\t" << R.data[i] << endl;
}
return out;
}
};
template <typename T>SeqList<T>::SeqList(int sz) {
if (sz > 0) {
maxSize = sz;
last = -1;
data = new T[maxSize];
if (data == NULL) {
cerr << "Memory allocating error!" << endl;
exit(1);
}
}
}
template <typename T>SeqList<T>::SeqList(SeqList<T>& L) {
maxSize = L.Size();
last = L.Length() - 1;
T value;
data = new T[maxSize];
if (data == NULL)
{
cerr << "Memory allocating error!" << endl;
exit(1);
}
for (int i = 1; i <= last + 1; i++)
{
L.getData(i, value); data[i - 1] = value;
};
}
template<typename T>void SeqList<T>::reSize(int newSize) {
if (newSize <= 0) {
cerr << "Invalid array index!" << endl;
return;
}
if (newSize != maxSize) {
T* newarray = new T[newSize];//建立新数组
if (newarray == NULL) {
cerr << "Memory allocating error!" << endl;
exit(1);
}
int n = last + 1;//改
T* srcptr = data;//源数组首地址
T* destptr = newarray;//目的数组首地址
while (n--) *destptr++ = *srcptr++;//复制
delete[]data;//删老数组
data = newarray;//复制新数组
maxSize = newSize;
}
}
template<typename T>int SeqList<T>::Search(T& x)const {
for (int i = 0; i <= last; i++) {
if (data[i] == x) return i + 1;
}
return 0;
}
template<typename T>int SeqList<T>::Locate(int i)const {
if (i >= 1 && i <= last + 1) return i;
else return 0;
}
template<typename T>bool SeqList<T>::Insert(int i, T& x) {
if (last == maxSize - 1) return false;
if (i < 0 || i > last + 1) return false;
for (int j = last; j >= i; j--) data[j + 1] = data[j];
data[i] = x;
last++;
return true;
}
template<typename T>bool SeqList<T>::Remove(int i, T& x) {
if (last == -1) return false;
if (i < 1 || i > last + 1) return false;
x = data[i - 1];
for (int j = i; j <= last; j++) data[j - 1] = data[j];
last--;
return true;
}
template<typename T>void SeqList<T>::Sort() {
for (int i = 1; i <= last; i++) {
for (int j = last; j >= i; j--) {
if (data[j - 1] > data[j]) {
T tmp = data[j - 1];
data[j - 1] = data[j];
data[j] = tmp;
}
}
}
}
template<typename T>void SeqList<T>::input() {
cout << "Input the size of the list which will be created:";
while (1) {
assert(cin >> last);
last--;
if (last < 0) {
cout << "Input error, the size must be positive!\n";
cout << "Input the size again:";
}
else if (last > maxSize - 1) {//改一改可以扩大
cout << "Input error, the size must be less than maxSize!\n";
cout << "Input the size again:";
}
else break;
}
cout << "\nInput the data for each element to create the list:" << endl;
for (int i = 0; i <= last; i++) {
cout << "#" << i + 1 << ":";
assert(cin >> data[i]);
}
}
template<typename T>void SeqList<T>::output() {
cout << "\nThe size of the list is:" << last + 1 << endl;
for (int i = 0; i <= last; i++) cout << "#" << i + 1 << ":\t" << data[i] << endl;
}
//SeqList<T> operator = (SeqList<T>& L);
template<typename T>SeqList<T> SeqList<T>::operator = (SeqList<T>& L) {//改
T value;
maxSize = L.Size();
last = L.Length() - 1;
delete[]data;//先清空
data = new T[maxSize];
if (data == NULL) {
cerr << "Memory allocating error!" << endl;
exit(1);
}
for (int i = 1; i <= last + 1; i++)
{
L.getData(i, value);
data[i - 1] = value;
}
return *this;
}
#endif
//main.cpp#include <iostream>
#include "SeqList.h"
#include<string>
#include <fstream>
#include <cassert>
using namespace std;
template<typename T>
SeqList<T> mul(const SeqList<T>& list1,const SeqList<T>& list2)
{
SeqList<int> list3(list1.Size() + list2.Size());//初始化结果的最大长度,用list3保存。乘法得到数字的位数一定不超过乘数位数之和
for(int i=0;i<list1.Size();i++)
for(int j=0;j<list2.Size();j++)
{
int x,y;
list1.getData(i, x);
list2.getData(j, y);
int z=0;
z += x * y;
list3.setData(i + j, z);
}
int t = 0;
for (int i = 0; i < list3.Size(); i++)//处理进位
{
int p;
list3.getData(i, p);
t += p;
int m = t % 10;
list3.setData(i, m);
t /= 10;
}
while (list3.Size() > 1 && (list3.last) == 0)//初始时结果的最高位为0,若最终最高位仍为0,去掉最高位的0
{
int q;
list3.Remove(list3.last, q);
}
return list3;
}
string multiply(string num1, string num2) {
//num1="123"
SeqList<int>list1,list2;
for(int i=num1.size()-1;i>=0;i--)
{
int x = num1[i] - '0';
list1.setData(list1.last, x);
}//list1=[3,2,1] 倒序输出
for (int i = num2.size() - 1; i >= 0; i--)
{
int y = num2[i] - '0';
list2.setData(list2.last, y);
}
SeqList<int> L;
L = mul(list1, list2);
string res = "";
for (int i = L.Size() - 1; i >= 0; i--)
{
int p;
res += to_string(L.getData(i, p));
}
return res;
}
int main() {
SeqList<int>l1, l2, l3;
}
典型的左右值不分问题
operator=()函数签名里写的的是一个SeqList<T>&类型的参数,接收一个左值引用
然而调用时mul()函数返回的是一个临时变量,也就是一个右值,无法进行转换
operator=()重载是有规则的,复制赋值运算符就写const SeqList<T>& ,移动赋值运算符就写SeqList<T>&& ,你这样SeqList<T>&显得不伦不类。
(关于移动赋值运算符和复制赋值运算符的区别,这个讲起来没完没了,建议上百度深入了解一下)
如果不想了解就无脑改成const SeqList<T>&
|