【问题标题】:Iterating through an array of objects C++ [closed]遍历对象数组C ++ [关闭]
【发布时间】:2021-12-15 21:44:24
【问题描述】:

我正在尝试通过数组迭代对象来设置这些对象的不同属性。我的对象的属性可能会随着时间而改变。

我的代码作为一个简化的例子:

// MyClass.h
class MyClass
{
/* class definitions */
};

extern MyClass object;
// MyClass.cpp
#include MyClass.h

/* Constructors, Destructors, Functions */
// main.cpp
void reload_objects();

int main()
{
   MyClass object[20];
   reload_objects();
{

void reload_objects();
{
   for (int i = 0; i < 20; i++){
      object[i].setProperties(/*args*/);
   }
}

我收到一个错误error: No match for 'operator[]' (operand types are ‘MyClass’ and ‘int’)。如果我将 for 循环移到 main 中,它会编译并运行良好。

是什么导致了这个错误?

以某种方式使用std::vector&lt;MyClass&gt; object(20) 会更容易还是更好?

【问题讨论】:

  • 这是一个范围问题:objectmain 中定义,但您的函数reload_objects 没有以文本形式包含在main 中,因此数组object 在那里不可见。相反,您的函数会看到全局变量 extern MyClass object
  • 变量的作用域对于 C++ 来说是如此的基础,以至于它很早就在最基本的介绍性文本中被引入。您遇到此问题的事实表明,您已经开始以最少(甚至可能为零)的努力来阅读介绍性材料。您需要阅读该材料,因为它是如此基础 - 如果没有基本的努力来获得这种理解,您就是在浪费您的时间以及您寻求帮助的任何人的时间。
  • @VictorEijkhout 啊,所以我只是在错误的范围内声明了object
  • @Peter 你说得对,错过这是一件非常愚蠢的事情。感谢您如此直率地指出如此简单而愚蠢的错误。我太笨了你必须自我感觉良好才能如此聪明。

标签: c++ arrays class object


【解决方案1】:

您给定的代码 sn-p 中有几个错误。你可以纠正它们,如下所示。我已经在我进行更改的地方添加了 cmets。

MyClass.h

#ifndef MYCLASS_H
#define MYCLASS_H
// MyClass.h
class MyClass
{
/* class definitions */
public:
MyClass() = default;
};

extern MyClass object[20]; //declare object as an array 

#endif

MyClass.cpp

// MyClass.cpp
#include "MyClass.h"

/* Constructors, Destructors, Functions */

ma​​in.cpp


#include <iostream>
#include "MyClass.h"

 MyClass object[20];    // define object here instead of inside main()
void reload_objects();  // reload_objects() doesnt take any argument by looking at its call and definiton

int main()
{
  // MyClass object[20]; //don't define object here
   reload_objects();
}

void reload_objects()  //you had a semicolon here so i removed it
{
   for (int i = 0; i < 20; i++){
      object[i].setProperties(/*args*/);
      ;
   }
}

另外不要忘记在上面的示例中添加其他成员函数的定义和声明,例如 setProperties 以使其正常工作。以下是我所做的一些更改:

  1. 您应该在 MyClass.h 中将 object 声明为大小为 20 的数组。
  2. 在 main.cpp 中的 main() 之外定义 object,就像我在示例中所做的那样。
  3. 在 main.cpp 中声明不带参数的函数 reload_objects()。

【讨论】:

  • 一些错误来自于我试图简化这个问题的代码的方式。看来我只是在错误的范围内声明了该对象。现在看来,错过真是一件愚蠢的事情。谢谢!
猜你喜欢
  • 2012-02-26
  • 2021-03-23
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2017-09-19
相关资源
最近更新 更多