【问题标题】:C++ Object Array PointerC++ 对象数组指针
【发布时间】:2020-07-07 18:42:13
【问题描述】:

我是 C++ 数组和指针的新手,遇到了一些问题。我对我编写的以下代码有一些疑问。

版本 1:

int main() 
{  
  string a, b;
  int age;
  Dog d[5];
  Dog *p = new Dog[5];

  for (int i = 0; i < 5; i++)
  {
    d[i].setwe(3 * i);
    d[i].setag(i);
    p[i] = Dog(d[i]);
  }

  p[5]->showCnt();
  //^^^^^^^^^^^^^^ Error above
  for (int j = 0; j < 5; j++)
  {
    delete [] p;
  }
  return 0;
}

版本 2:

int main() 
{  
  string a, b;
  int age;
  Dog d[5];
  Dog *p[5];

  for (int i = 0; i < 5; i++)
  {
    d[i].setwe(3 * i);
    d[i].setag(i);
    //p[i] = Dog(d[i]);
    p[i] = &d[i];
  }

  p[5]->showCnt();
  return 0;
}

据我了解,我可能在版本 1 中写错了,但我想了解为什么 p 在版本 1 中不被视为指针?

这是我从错误中得到的提示:'->' 的基本操作数有非指针类型'Dog'

我也不确定将对象数组复制到指针对象数组的更好方法(版本 1 或版本 2)。 如果我理解错了,我想提前道歉。谢谢。

【问题讨论】:

  • 在这两种情况下,p[5] 都超出了数组的末尾,而不是对象。

标签: c++ arrays class object pointers


【解决方案1】:

p[5]-&gt;showCnt() 是非法的,因为您的对象数组只有 5 个位置,从 0 开始到 4 结束。因此,您只需将 p[5]-&gt;showCnt() 替换为 p[4]-&gt;showCnt()

关于要使用的更好版本,如果您想使用静态大小,请使用版本 2;如果您想动态管理 p 以在程序运行时的某个时刻处理超过 5 个对象,请使用版本 1。简短的回答:版本 1 更好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2011-02-12
    • 1970-01-01
    • 2014-08-19
    • 2012-10-12
    • 2016-12-23
    • 2012-03-09
    • 2021-09-02
    相关资源
    最近更新 更多