【问题标题】:Add Object to Array of Objects in C++在 C++ 中将对象添加到对象数组
【发布时间】:2012-03-11 14:52:25
【问题描述】:

有一个对象数组,要向其中添加对象,我尝试以下操作:

Shape ShapeList[30];

void addShape(Shape s)
{
  for(int i=0; i<30;i++)
  {
    if(ShapeList[i] != '\0')
        { i++;}
    else
        {
            ShapeList[i]=s;
            numShapes++;
            break;
        }
   }
}

numShapes 是整数变量,Shape 是类,ShapeList 是对象数组。但是编译器以这种方式给出了一个错误,即不允许使用 != 运算符。那么我该如何实现呢?

【问题讨论】:

  • ShapeList 是像Shape这样的类吗?如果是这样,您应该调用 ShapeList 的实例,而不是类名。
  • ShapeList 是对象数组
  • @user 我严重怀疑你接受的答案是否真的会对你有所帮助。

标签: c++ arrays oop


【解决方案1】:

我认为您需要更改您的“容器”声明:

Shape *ShapeList[30];

void addShape(Shape *s)
{
  for(int i=0; i<30;i++)
  {
    if(ShapeList[i])
        { i++;}
    else
        {
            ShapeList[i]=s;
            numShapes++;
            break;
        }
   }
}

并以这种方式调用 addShape:

addShape(new Shape());

【讨论】:

  • 请注意,虽然这个答案修复了代码中的明显问题,但它仍然不是好的代码。特别是,它容易出现内存泄漏。 C++ 为此提供了卓越的机制。
  • @konradrudolph 你能推荐任何其他机制吗
  • @user 确实要看具体的场景,但是如果你不需要多态,那就不要使用指针了;直接存储对象。否则,一种简单的通用解决方案是使用std::shared_ptr 代替原始指针,使用std::arraystd::vector 代替数组。
  • 我尽可能保持最简单的答案,因为正确处理内存的主题值得更多的问题/答案:)
【解决方案2】:

ShapeList[i] 返回Shape 类型的对象。在这种情况下,您可以重载operator != (char)

class Shape
{
//your implementation
//
public:
   bool operator != (char x) const
   {
     // comparison logic
   }
};

另外,我相信你这里有一个错误:

if(ShapeList[i] != '\0')
    { i++;}

我假设您想跳过这种情况,但您已经在 for 循环中增加了 i。你可能想要:

if(ShapeList[i] != '\0')
    { continue;}

正如其他人指出的那样,您应该使用 std::vector 而不是原始数组。我最初认为ShapeListstd 容器的包装器。

【讨论】:

  • 你还没有将对象添加到数组中
  • 这个答案很混乱。您可能会得到像这样编译的代码,但它肯定不是 OP 想要的。
  • @KonradRudolph 我假设他想将Shapechar 进行比较。
  • @Luchian 显然。但我怀疑情况是否如此,否则问题将完全不同。我的猜测是 chac 的答案或多或少是正确的(但他的最小修复也不是解决问题的好方法)。
  • @KonradRudolph 可能是,如果这确实是操作想要做的。我们可以假设。
【解决方案3】:
Shape * ShapeList[30];   
  numShapes=0;   

     void addShape(Shape* s)
        {
            if( i>=30)
                return;
            ShapeList[numShapes++]=s;      // provided you need to insert at end
        }

你不能使用\0,因为它是一个数组,而不是一个字符串。

这样存储整个对象是内存开销。除非您有局部变量超出范围问题,否则指针是更好的选择。如果 STL 和 Vectors 不超出您的项目范围,您可以尝试使用它。您可以在其中使用 pushback() 或 pushfront()

【讨论】:

  • 这如何回答这个问题?
  • 你觉得这有什么问题吗?
  • 它没有回答问题。
  • 他想实现一个对象数组。这确实解决了它
  • @CodingMastero:如果您想在答案中添加内容,请编辑您的答案。不要让它成为评论。具体来说,您对使用 STL 的建议应该是编辑,而不是评论。
【解决方案4】:

您没有指定如何声明 ShapeList

使用 != 运算符将其与字符 NUL 进行比较, 而下面的 4 行则为它分配一个 Shape 对象。

我认为你想要实现的是:在指向 Shape 的指针数组中找到一个空槽,并将 Shape 存储在那里。

但可能更好的是使用 std::vector 或 std::list,然后 push_back 你的形状。

您必须问自己的另一件事:我要存储我的 Shape 对象的副本还是指针?

【讨论】:

    【解决方案5】:

    除非您在 Shape 类中有一个转换运算符来将其转换为字符,或者一个将字符作为参数的不相等比较运算符,否则您不能将 Shape 对象与 char 进行比较像你一样。

    您应该使用std::vectorstd::array 并使用at 成员函数来查看条目是否存在。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2022-01-13
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2021-12-29
      • 2022-01-16
      • 2013-01-03
      相关资源
      最近更新 更多