Так что я новичок и пытаюсь разобраться в этой проблеме:
Это мой кусок кода:
int main()
{
list<Shape*> shapes;
shapes.push_back(new Pentagon(Vertex(20, 10), 8));
shapes.push_back(new Rhombus(Vertex(50, 10), 8));
list<Shape*>::iterator itr = shapes.begin();
while (itr != shapes.end())
{
(*itr)->drawShape();
c.gotoXY(20, 10);
cout << (*itr)->area();
// scale shape (double it)
// draw shape
// rotate shape by 20 degrees
// draw shape
itr++;
}
cout << endl << endl << endl << endl << endl << endl << endl << endl;
system("pause");
}
Итак, в основном, первый блок текста добавляет два новых объекта, Пентагон и Ромб, к фигурам списка.
Эти объекты имеют 3 значения, координаты x и y и размер.
а затем в итераторе я пытаюсь нарисовать эти фигуры в консоли, которая работает нормально, но у меня есть проблема с c.gotoXY();
функция.
По сути, я хочу, чтобы область отображалась в середине фигуры. Это работает просто отлично, когда я набираю координаты вручную: (20, 10)
в коде, для Пентагона. Вы можете видеть, что это то же самое, что и значения, которые я ввожу, когда добавляю новые вещи в список.
Но у меня будет много разных форм, и я не могу просто ввести значения вручную.
Я хотел бы связать значения x и y со значениями объектов в моем списке фигур следующим образом:
http://puu.sh/hlMMR/2f536907f9.png
по сути, каждый раз, когда итератор обходит его, он берет значения x и y следующего объекта в списке и помещает их в c.gotoXY();
Надеюсь, я объяснил это достаточно ясно, потому что сам едва понимаю.
Пожалуйста помоги.
@ Редактировать ~~~~~~~~~
когда я пытаюсь использовать
c.gotoXY(Vertex.getX(), Vertex.getY);
Я получаю это:
ошибка C3867: «Vertex :: getY»: вызов функции отсутствует в списке аргументов; использовать&Vertex :: getY ‘для создания указателя на член
Я представляю твои Shape
Тип имеет функцию-член что-то вроде:
Vertex getPosition() const;
И ваш Vertex
Тип имеет функции-члены что-то вроде:
int getX() const;
int getY() const;
В этом случае вы можете написать что-то вроде:
Shape* curr=*itr; //Get a pointer to the current shape from the iterator.
Vertex pos=curr->getPosition());//Get the position of the current shape.
c.gotoXY(pos.getX(),pos.getY());//Goto the current position of the current shape.
На месте:
c.gotoXY(20, 10);
Если вы еще не предоставили способы доступа к вершине фигуры и координатам вершины — это первая проблема, которую нужно решить.
РЕДАКТИРОВАТЬ: я замечаю в комментариях getX()
а также getY()
на месте. Это доступ к Vertex
в форме, которая все еще открыта.
Если Shape
класс еще не имеет, включить getPosition()
функция, которая возвращает Vertex
объект с позиции, с которой вы его инициализировали. Что-то вроде:
Vertex Shape::getPosition() const
{
return m_Position; // position of the shape (this member would have been set by
// the constructor when you called, for example,
// shapes.push_back(new Pentagon(Vertex(20, 10), 8)); in the
// main function
}
Таким образом, в вашей основной функции вы можете вызвать ее, чтобы получить позицию и соответственно расположить фигуру:
while (itr != shapes.end())
{
(*itr)->drawShape();
Vertex position = (*itr)->getVertex();
c.gotoxy(position.getX(), position.getY());
cout << (*itr)->area();
++itr;
}
Кроме того, в вашей редакции оригинального сообщения:
c.gotoXY(Vertex.getX(), Vertex.getY);
вы пропустили «()», так что это будет:
c.gotoXY(Vertex.getX(), Vertex.getY());
Однако это не сработает, так как вы вызываете функции-члены getX()
а также getY()
через тип класса, а не через объект. Вы должны будете объявить и инициализировать объект класса перед вызовом его функций-членов, как я делаю с объектом position
в то время как цикл выше.