提问人:satej dhakane 提问时间:6/15/2023 更新时间:6/15/2023 访问量:77
试图制作一个矢量库?但卡在=运算符的重载中
trying to make a vector library ? But stuck in overloading of = operator
问:
我正在尝试构建向量库。代码如下所示
#include <iostream>
#include <string>
namespace std
{
template<typename T>
class vector
{
private:
T* value;
T* temp;
int arraySize{1};
public:
vector()
{
value=NULL;
temp=NULL;
}
int size()
{
return arraySize;
}
void push(T val)
{
if(value==NULL)
{
value=new T[arraySize];
value[arraySize-1]=val;
}
else if(value!=NULL)
{
arraySize=arraySize+1;
temp=new T[arraySize];
int lastIndex=arraySize-1;
for(int j=0;j<lastIndex;j++)
{
temp[j]=value[j];
}
temp[lastIndex]=val;
delete[] value;
value=temp;
temp=NULL;
}
}
T pop()
{
int popIndex=arraySize-1;
T t = value[popIndex];
arraySize=arraySize-1;
if(arraySize>=0)
{
temp=new T[arraySize];
for(int j=0;j<popIndex;j++)
{
temp[j]=value[j];
}
delete[] value;
value=temp;
temp=NULL;
return t;
}
else if(arraySize<0)
{
std::cout<<"Memory underflow\n";
reset();
}
}
T operator[](int index)const
{
return value[index];
}
T front()const
{
return (value[arraySize-1]);
}
T back()const
{
return (value[0]);
}
private:
void reset()
{
arraySize=1;
vector();
}
};
}
int main()
{
std::vector<std::string> v;
v.push("1");
v.push("2");
v.push("3");
std::cout<<"the element is : "<<v[1]<<"\n";
std::cout<<"front element is : "<<v.front()<<"\nback(last) element is : "<<v.back()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
v.push("4");
std::cout<<"size : "<<v.size()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
}
我已经为 v[1] 重载了这个 [] 运算符,但我想这样写,例如
v[2]="2";
我应该怎么做 请帮忙 .如果要完成,请建议对代码进行一些更改
我试图寻找 = 运算符的重载,但它告诉你只能接受一个参数
答:
0赞
463035818_is_not_an_ai
6/15/2023
#1
让我们将其分解为一个更简单的示例,因为坦率地说,您的代码有太多问题无法通过单个答案来解决。评论中提到了其中的一些,你应该认真对待它们,因为你非常破碎。让我们只考虑一个方法的实现,该方法返回您可以分配给的内容。换句话说,我们想编写以下代码:vector
int main() {
foo f;
f.set("123"); // sets a member
f.get() = "42"; // gets something that can be used to
// assign to the member
std::cout << f.get() << "\n";
}
输出应该是 .42
我们需要一个默认构造函数。我们需要一个方法来设置字符串。单个字符串作为成员就足够了。要开始工作,您不需要实现 .分配的是一个字符串。 已经有一个 .但是,应返回对内部字符串的引用。它不应返回内部字符串的副本,因为修改该副本不会对成员产生任何影响。返回引用。push
f.get() = "42";
operator=
std::string
operator=
get()
struct foo {
std::string data;
void set(const std::string& x) { data = x; }
using reference = std::string&;
reference get() { return data; }
};
对于进一步的阅读,我建议...
评论
T& operator[](int index) { return value[index]; }
std
vector
my::vector
temp
vector()
reset
v[2] = "2";
与超载无关. 用于分配向量,当您写入时,您分配的是字符串而不是向量。问题是你返回了错误的类型。它应该返回 not .然后你就可以写了。vector::operator=
vector::operator=
v[2]="2";
vector::operator[]
T&
T
v[2]="2";