Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Frankenween
22 / 1 / 0
Регистрация: 25.10.2016
Сообщений: 36
1

Неправильно работают методы в классе

13.05.2017, 10:39. Просмотров 729. Ответов 4
Метки нет (Все метки)

Есть класс GameObject в котором есть виртуальный метод draw:
C++
1
2
3
4
5
6
7
8
9
class GameObject {
public:
    float xpos = 0;
    float ypos = 0;
    int xsize = 0;
    int ysize = 0;
    sf::Sprite this_sprite;
    virtual void draw(sf::RenderTarget &window) { window.draw(this_sprite); };
};
Есть так-же класс Tank: public GameObject, в котором также есть метод draw, но выглядит он вот так:
C++
1
2
3
4
5
6
7
8
void draw(RenderTarget &window) {
        /*
        Передаю функции set_current_animation спрайт такна с текстурой в виде всего тайлсета
        и на выходе получаю спрайт с нужным кадром
        */
        animation.set_current_frame(this_sprite);
        window.draw(this_sprite);
    }
Все объекты хранятся в векторе vector<GameObject> game_rects. В нём присутствуют только наследники класса GameObject типа Tank. Я в цикле для каждого объекта в game_rects вызываю метод draw(window), но у объектов класса Tank вызывается метод draw класса GameObject, а нужно чтобы вызывался вот этод метод:
C++
1
2
3
4
5
6
7
8
void draw(RenderTarget &window) {
        /*
        Передаю функции set_current_animation спрайт такна с текстурой в виде всего тайлсета
        и на выходе получаю спрайт с нужным кадром
        */
        animation.set_current_frame(this_sprite);
        window.draw(this_sprite);
    }
Как мне это реализовать?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2017, 10:39
Ответы с готовыми решениями:

Не работают методы в классе с контейнером map
#include &lt;map&gt; #include &lt;iostream&gt; #include &lt;string&gt; class Superclass { ...

Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно
Программа должна симулировать движение планет в звёздной системе, она...

неправильно берёт x,y в классе ellips
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; #include...

В классе дек неправильно работает оператор +
Я написал класс дек. И вскоре обнаружилась проблема того что оператор +...

Константные и неконстантные методы в классе
Здравствуйте! Вот задача https://stepik.org/lesson/563/step/6?unit=886 Я...

4
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,031
Записей в блоге: 2
Завершенные тесты: 1
13.05.2017, 11:27 2
хм,странно, баганый смфл значит!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
class MyBase
{
public:
    virtual void draw(const char* shape);
};
void MyBase::draw(const char *shape) { std::cout << "MyBase::draw(" << shape << ")\n"; }
 
 
class MyTest: public MyBase
{
public:
    virtual void draw(const char* shape);
};
void MyTest::draw(const char *shape) { std::cout << "MyTest::draw(" << shape << ")\n"; }
 
 
int main()
{
    MyBase base;
    base.draw("NULL");
 
    MyTest test;
    test.draw("Tank");
 
 
    return 0;
}
MyBase::draw(NULL)
MyTest::draw(Tank)
Для закрытия данного окна нажмите <ВВОД>...
1
Frankenween
22 / 1 / 0
Регистрация: 25.10.2016
Сообщений: 36
13.05.2017, 11:44  [ТС] 3
dailydose, и что делать? мне кажется тут не с сфмл проблема, ведь сама функция не вызывается. вот код, который должен вызывать draw:
C++
1
2
3
for (auto &obj : game_rects) {
    obj.draw(window);
}
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
13.05.2017, 13:29 4
Лучший ответ Сообщение было отмечено Frankenween как решение

Решение

Цитата Сообщение от Frankenween Посмотреть сообщение
Все объекты хранятся в векторе vector<GameObject> game_rects. В нём присутствуют только наследники класса GameObject типа Tank.
Цитата Сообщение от Frankenween Посмотреть сообщение
что делать?
Чтобы полиморфизм работал нужны указатели на GameObject, а не объекты.

Добавлено через 8 минут
Чтобы далеко не ходить, слегка переделаем пример dailydose:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MyBase
{
public:
    virtual void draw();
};
void MyBase::draw() { std::cout << "MyBase::draw\n"; }
 
 
class MyTest: public MyBase
{
public:
    virtual void draw();
};
void MyTest::draw() { std::cout << "MyTest::draw\n"; }
 
 
 
int main()
{   
    vector <MyBase*> v;
    for (int i = 0; i < 3; ++i)
    {
        MyTest* p = new MyTest;
        v.push_back(p);
    }
 
    for (int i = 0; i < v.size(); ++i)
    {
        v[i] ->draw();
    }
}
1
Frankenween
22 / 1 / 0
Регистрация: 25.10.2016
Сообщений: 36
13.05.2017, 13:35  [ТС] 5
nd2, Спасибо большое, разобрался. Теперь всё работает
0
13.05.2017, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2017, 13:35

Не работают функции в классе
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;nasled.h&quot; using namespace...

Можно ли в не шаблонном классе создать шаблонные методы?
Можно ли в не шаблонном классе создать шаблонные методы? Пример: Есть...

где лучше реализовывать методы в классе или вне
читал где-то, что реализация метода в теле класса или вне его не одно и то же....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru