Чисто виртуальный метод, вызываемый в производном классе PlayerC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Чисто виртуальный метод, вызываемый в производном классе Player

Сообщение Anonymous »

Все! Я пишу простую 2D-игру на sfml. Я сделал черновую версию игры, но когда я запускаю программу, она возвращает ошибку «Вызов чисто виртуального метода». Отладчик написал проблему в методе GameObject->Update(). Именно в Player->Update(). Как вы видите, я написал абстрактный класс GameObject для правильного использования подклассов в основной функции
GameObject.h
#include
#include "Window.h"
class GameObject
{
public:
GameObject() = default;
virtual void Update(const float& frametime) = 0;
virtual void Render(const std::shared_ptr& window) = 0;
virtual sf::Vector2f getPosition() = 0;
virtual ~GameObject() = default;
};

Player.h
#include "Graphics.hpp"
#include"Audio.hpp"
#include "Window.h"
#include "ObjectConstructor.h"
#include "GameObject.h"
#include
#include

using namespace std::chrono;

class Player : public GameObject {
public:
Player();
void Update(const float& frametime) override;
void Render(const std::shared_ptr& window) override;
sf::Vector2f getPosition() override;
~Player() override;

void SetOC(ObjectConstructor* oc);

private:
float speed = 125; //default speed
ObjectConstructor* OC = nullptr; //Object constructor to get game data
sf::Vector2f m_pos;
sf::Texture m_playerTexture;
sf::SoundBuffer buffer;
sf::Sound ShotSound;
steady_clock::time_point lastShotTime;
duration timeBetweenShots = 0.45s;

};

Плеер. ЦПП
#include "../include/Player.h"
#include "../include/Bullet.h"
Player::Player()
{
m_playerTexture.loadFromFile("../assets/ship.png");
m_pos = sf::Vector2f(sf::VideoMode::getDesktopMode().width / 8, sf::VideoMode::getDesktopMode().height / 2);
lastShotTime = steady_clock::now();
buffer.loadFromFile("../assets/shootSFX.mp3");
ShotSound.setBuffer(buffer);

}

void Player::Update(const float& frametime)
{
sf::Event event;
sf::RenderWindow& m_window = OC->GetWindow()->GetRenderWindow();
while(m_window.pollEvent(event))
{
if(event.type == sf::Event::KeyPressed)
{
if(event.key.code == sf::Keyboard::W && m_pos.y > 64)
m_pos.y += speed * frametime;
else if(event.key.code == sf::Keyboard::S && m_pos.y < m_window.getSize().y -64)
m_pos.y -= speed * frametime;

if(event.key.code == sf::Keyboard::Space && lastShotTime + timeBetweenShots GetWindow());
newBullet.SetOC(OC);
OC->GetObjects()->push_back(&newBullet);

ShotSound.play();
lastShotTime = steady_clock::now();
}
}
}
}

void Player::Render(const std::shared_ptr& window)
{
sf::RenderWindow& m_window = OC->GetWindow()->GetRenderWindow();
sf::Sprite sprite(m_playerTexture, sf::IntRect(m_pos.x - m_playerTexture.getSize().x /2,
m_pos.y - m_playerTexture.getSize().y /2,m_playerTexture.getSize().x,m_playerTexture.getSize().y));
m_window.draw(sprite);
}

void Player::SetOC(ObjectConstructor* oc){
OC = oc;
}

sf::Vector2f Player::getPosition()
{
return m_pos;
}

ObjectConstructor.h
class Player;
class Bullet;
class ObjectConstructor {
public:
ObjectConstructor();
~ObjectConstructor() = default;
std::shared_ptr GetWindow();
std::vector* GetObjects();
std::vector* GetBullets();
// std::vector* GetEnemies();
private:
int score = 0;
std::shared_ptr m_window;
std::vector m_game_objects;
std::vector bulletCollisionObjects;

};

ObjectConstructor.cpp

ObjectConstructor::ObjectConstructor()
{
Window temp_w = Window("Space Wars", sf::Vector2u(720, 1280));
m_window = std::move(std::make_shared(temp_w));
Player newPlayer = Player();
newPlayer.SetOC(this);
m_game_objects.push_back(std::move(&newPlayer));
}

std::vector* ObjectConstructor::GetObjects(){
return &m_game_objects;
}

std::shared_ptr ObjectConstructor::GetWindow()
{
return m_window;
}

std::vector* ObjectConstructor::GetBullets(){
return &bulletCollisionObjects;
}


main.cpp
#include "../RegularGame/include/Player.h"
#include "../RegularGame/include/Bullet.h"
#include "../RegularGame/include/ObjectConstructor.h"
#include "../RegularGame/include/Game.h"
int main()
{
ObjectConstructor objects;
while (objects.GetWindow().get()->IsDone() == 0)
{
for (auto& gameObject : *objects.GetObjects())
{
gameObject->Update(0.015);
objects.GetWindow().get()->Update();
}
for (auto& gameObject : *objects.GetObjects())
{
gameObject->Render(objects.GetWindow());
}
}
objects.~ObjectConstructor();
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... ass-player
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»