c++ 想建立一个矢量库但是在=运算符的重载中卡住了

yzuktlbb  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(84)

我正在尝试构建矢量库。代码如下所示

#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";
我该怎么做请帮帮忙。如果要做的话,请提出一些代码修改的建议
我试图寻找=运算符的重载,但它告诉你只能接受一个参数

nlejzf6q

nlejzf6q1#

让我们把它分解成一个更简单的例子,因为坦率地说,你的代码有太多的问题要在一个答案中解决。评论中提到了其中的一些,你应该认真对待,因为你的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; }
    
};

Live Demo
为了进一步阅读我推荐…

相关问题