Добавить объект в массив объектов в C ++ - PullRequest
4 голосов
/ 21 февраля 2012

Существует массив объектов, и для добавления объекта к нему я пытаюсь сделать следующее:

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 ]

4 голосов
/ 21 февраля 2012

Я думаю, вам нужно изменить объявление «контейнера»:

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());
2 голосов
/ 21 февраля 2012

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 вместо необработанного массива.Сначала я предположил, что ShapeList был оберткой над std контейнером.

1 голос
/ 21 февраля 2012
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 ()

0 голосов
/ 21 февраля 2012

Вы не указали, как объявляется ShapeList.

С помощью оператора! = Вы сравниваете его с символом NUL, а 4 строками ниже вы назначаете ему объект Shape.

Я думаю, что вы пытаетесь достичь, это: найти пустой слот в массиве указателей на Shape и сохранить Shape там.

Но, вероятно, лучше использовать либо std :: vector, либо std:: list и push_back вашей фигуры.

Еще одна вещь, которую вы должны задать себе: хочу ли я хранить копии моего объекта Shape или указатели?

0 голосов
/ 21 февраля 2012

Если у вас нет оператора преобразования в классе Shape для преобразования его в символ или оператора неравенства сравнения, который принимает символ в качестве аргумента, вы не можете сравнить объект Shape с charкак вы делаете.

Вы должны использовать std::vector или std::array и использовать функцию-член at, чтобы увидеть, существует запись или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...