Arrays 在c++;

Arrays 在c++;,arrays,visual-c++,object,dynamic,Arrays,Visual C++,Object,Dynamic,嗨,我正在做一个项目,在这个项目中,我从一个文件中访问信息,然后将其放入一个对象数组中,然后从菜单的选项中操作对象中的数据。我目前遇到的问题是,菜单中的一个选项是向对象添加新元素。该项目声明我必须使用一个对象数组,这样我就不能只使用一个向量我要将数组放入的类中调整大小,它使用一个临时动态数组作为对象,然后删除原始数组 这是这门课的样子 class Info { private: string name; double money; public: Info(){ na

嗨,我正在做一个项目,在这个项目中,我从一个文件中访问信息,然后将其放入一个对象数组中,然后从菜单的选项中操作对象中的数据。我目前遇到的问题是,菜单中的一个选项是向对象添加新元素。该项目声明我必须使用一个对象数组,这样我就不能只使用一个向量我要将数组放入的类中调整大小,它使用一个临时动态数组作为对象,然后删除原始数组

这是这门课的样子

class Info
{
private:
   string name;
   double money;
public:
   Info(){
     name=""; 
     money=0;
   }

   void Setname(string n){
     name=n;
   }
   void Setmoney(double m){
     money=m;
   }
   string GetName()const{
      return name;
   }
   double GetMoney()const{
      return money;
   }
};
现在这只是一个类的样本,实际的类有方程来改变money变量,但是为了这个问题的目的,这就是所需要的。这里是我遇到问题的函数

void Addinfo(Info in [], int & size){
      string newname;
      double newmoney;
      cout<<"What name are you going to use?"<<endl;
      cin>>newname;
      cout<<"Now How much money do you have currently"<<endl;
      cin>>newmoney;
      Info *temp= new Info[size+1];
      for(int index=0; index<size;index++){
          temp[index].Setname(in[index].GetName());
          temp[index].Setmoney(in[index].GetMoney());
      }
      delete []in;
      temp[size].Setname(newname);
      temp[size].Setmoney(newmoney);
      in=temp;
      size=size+1;
}
void Addinfo(信息格式为[],整数和大小){
字符串newname;
双倍新币;

当您有一个类型为valueName[]数组参数,然后只需将数组参数的地址传递给函数。调用函数就拥有该数组的所有权。除了函数签名之外,您还必须考虑调用方和调用函数之间的一个约定,该函数定义指针传递的数据的所有权。 您的函数
AddInfo
获取指针传递的数组,调用函数希望在函数调用后数据可用。因此,当您
中删除[]时,函数违反了约定

当您使用
in=temp;
分配新值时,您的函数将
中的参数
用作(局部)变量。这是合法的。但您不能期望更改的局部变量对调用者有任何影响。使用当前函数签名,可以通过以下方式调用函数:

Info infos[5];
Addinfo(&info[3], 2);
显然,修改
&info[3]
毫无意义。当合同允许向数组中添加一些数据时,您需要一个允许更改指针的签名。例如:

void Addinfo(Info*& in, int& size, string newname, double newmoney)
{
  Info *temp= new Info[size+1];
  for(int index=0; index<size;index++){
      temp[index].Setname(in[index].GetName());
      temp[index].Setmoney(in[index].GetMoney());
  }
  temp[size].Setname(newname);
  temp[size].Setmoney(newmoney);
  delete []in;
  in = temp;
  size=size+1;
}

void Addinfo(Info*& in, int& size)
{
  string newname;
  double newmoney;
  // input data
  cout<<"What name are you going to use?"<<endl;
  cin>>newname;
  cout<<"Now How much money do you have currently"<<endl;
  cin>>newmoney;
  // TODO: data validation.
  // add data to array
  Addinfo(in, size, newname, newmoney);
}
void Addinfo(Info*&in,int&size,string newname,double newmoney)
{
信息*临时=新信息[大小+1];

对于(int index=0;indexi)如果要将
in
设置为临时数组,可能应该将其作为指针的引用传入。您的
in=temp
赋值现在没有任何有用的效果,因为
in
正在按值传入