在C ++中将对象添加到对象数组

时间:2012-02-21 09:34:03

标签: c++ arrays oop

有一个对象数组,为了向它添加对象,我尝试以下方法:

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是对象数组。但是编译器以这种方式给出错误,不允许!=运算符。那么我该如何实现呢?

5 个答案:

答案 0 :(得分:4)

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

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());

答案 1 :(得分:2)

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

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

另外,我相信你在这里犯了错误:

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

我假设您要跳过此案例,但您已在i循环中增加for。你可能想要:

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

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

答案 2 :(得分:1)

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()

答案 3 :(得分:0)

除非Shape类中有转换运算符将其转换为字符,或者将字符作为参数的不等于比较运算符,否则无法将Shape对象与像你一样char

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

答案 4 :(得分:0)

您未指定ShapeList的声明方式。

使用!=运算符将其与字符NUL进行比较, 下面有4行你为它指定一个Shape对象。

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

但可能更好的方法是使用std :: vector或std :: list,以及push_back你的形状。

你必须要问自己的另一件事:我想存储我的Shape对象或指针的副本吗?