【问题标题】:Getting an object's array index in C++在 C++ 中获取对象的数组索引
【发布时间】:2012-12-31 01:36:34
【问题描述】:

假设我有一个对象数组,我想根据它们的数组索引(0、1、4...等)在这些对象中设置变量。有没有办法通过成员函数获取对象的索引(在其父数组中),即不传递整数?

编造的例子:

class Car
{
    public:
        void init();
    private:
        short weight;
};

void Car::init()
{
    // affect 'weight' based on object's array index
}

Car myCars[7];

myCars[2].init();

有没有办法从 init() 中检索 myCars 的索引(即 2),而函数没有从外部接收整数?

我知道这没有必要,但我很好奇这是否可能。

谢谢。

【问题讨论】:

  • 不。 (此处填写)
  • 只是!除非您将索引与 Car 实例一起存储,否则这是不可能的。
  • 谢谢大家的回答,我会走平时的路线。

标签: c++ arrays class object indexing


【解决方案1】:

没有。

但作为替代方案,您可以将初始化移动到构造函数(如果适用)。创建数组时会自动调用它。但这也不会让您根据索引调整权重。

【讨论】:

  • 如何使用构造函数来替代查找放置对象的某个数组的索引?
  • 不,init 这个名字误导了我。更新了答案。
【解决方案2】:

不,C++ 语言不提供这样的功能。如果你真的需要它(仔细检查你的设计),你必须在 中传递它并 如果你的对象的索引发生变化(例如,如果你插入容器的中间) .

【讨论】:

  • 谢谢,这就是我想知道的。这对我的设计来说并不重要,没有什么能阻止我以通常的方式传递变量。这只是一个原则问题。
【解决方案3】:

您愿意为init 方法提供更多信息吗?您可以使用一些指针算法执行以下操作:

#include <iostream>

using namespace std;

class Car
{
    public:
        void init(const Car*);
    private:
        short weight;
};

void Car::init(const Car* arr)
{
    // affect 'weight' based on object's array index
    int idx = this - arr;
    cout<< "My index: " << idx << endl;
}

int main()
{
  Car myCars[7];

  for(int i = 0 ; i < 7 ; ++i)
    myCars[i].init(myCars);
  return 0;
}

【讨论】:

  • 为什么myCars[i].init(myCars); 比直接作为myCars[i].init(i); 传递更好。
  • 它不一定更好,但是,如果您实际上不知道 i 或想要进行健全性检查,它可能会更强大。例如,如果有一个指针在Car* myCar = &amp;myCars[x]; 周围飞来飞去,指向任意的x,那么您不需要保存该值来执行此计算。至于完整性检查,通过这种方式您可以检查是否&amp;arr[idx] == this 以查看计算是否在正确的数组上进行。这在很大程度上取决于实施,实际上以及 OP 想要保证的内容。
猜你喜欢
  • 2014-05-14
  • 2012-02-21
  • 1970-01-01
  • 2020-05-04
  • 2017-06-16
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多