Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.03.2018, 21:56

UniquePointer Fehler

Hallo habe ein Problem.


game.h
std:: unique_ptr <GameState> CurrentState;

game.cpp

CurrentState = std::make_unique<MainMenuState>(); // das = wird rot unterstrichen und die fehlermeldung ist: kein Operant stimmt mit diesem operaten ein(C2679)
habe dann ein auto davor gemacht und jetzt wird mir das nicht mehr als fehler angezeigt aber ich weiß nicht ob es dann geht weil siehe unten auch nicht geht

CurrentState ->Update (*this);// Der ausdruck muss den Typ pointer to class aufweißen. C2839

ist vom Tutorial
https://www.youtube.com/watch?v=0JA85yZ4…McSBTyF&index=4

aber ich habe schon mal was gemacht was eigentlich genau das selbe ist aber der Fehler wird mir nur bei dem Projekt angezeigt :dash:

2

25.03.2018, 22:51

Hallo, es wäre toll, wenn man etwas mehr Code sehen könnte, ohne das ganze Tutorial anzuschauen.

Das ganze kann nicht funktionieren, weil CurrentState vom Typ std::unique_ptr<GameState> ist, du CurrentState aber eine Variable vom Typ std::unique_ptr<MainMenuState> zuweist.

Bitte bessert mich aus, falls das totaler Blödsinn war.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

25.03.2018, 23:21

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <memory>

class BaseState {
public:
    virtual void update() = 0;
};

class RealState : public BaseState {
public:
    virtual void update() {
        std::cout << "something happened!" << std::endl;
    }
};

int main()
{
    std::unique_ptr<BaseState> current_state = std::make_unique<RealState>();
    current_state->update();

    return 0;
}


So kannst du es machen. Was dein this Problem angeht, ich weiß nicht was deine update-Methode erwartet und von welchem Typ this genau ist, von daher kann ich dazu nichts sagen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

26.03.2018, 06:31

Bitte bessert mich aus, falls das totaler Blödsinn war.
Das geht schon, falls MainMenuState von GameState erbt.

// das = wird rot unterstrichen und die fehlermeldung ist: kein Operant stimmt mit diesem operaten ein(C2679)
Bitte schreib Fehlermeldungen nicht mehr ab, sondern kopier sie. Von den Rechtschreibfehlern mal abgesehen, geht das nämlich auch viel schneller.
Damit wir dir helfen können, wirst Du mehr Code zeigen müssen über die Deklaration deiner Klassen. Das da reicht jedenfalls nicht.

Ich habe übrigens mal ein paar Sekunden in das Video reingeschaut und war erschreckt, wie viel Unwissen da schon heraus stach. Sorry, aber such dir was vernünftiges (z.B. ein Buch!), wo die Leute wenigstens wissen, warum sie gewisse Dinge hinschreiben und warum nicht, bevor dir Unsinn erzählt oder etwas falsch erklärt wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

26.03.2018, 10:12

Das geht schon, falls MainMenuState von GameState erbt.

Das geht aber eben aus dem Theead nicht heraus, ohne sich das Video anzuschauen.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

6

26.03.2018, 12:25

#pragma once
//Game.cpp

#include "Game.h"

const sf::Time Game::TimePerFrame = sf::seconds(1.f / 60.f);

Game::Game()

{

Window.create(sf::VideoMode(960, 540), "StarWars!");
if (!m_TextFont.loadFromFile("assets\\fnt\\BRLNSR.ttf"))
throw std::runtime_error("Faild to load the Font tahome in Game.cpp");


m_StatisticsText.setFont(m_TextFont);
m_StatisticsText.setFillColor(sf::Color::Red);
m_StatisticsText.setCharacterSize(10);
m_StatisticsText.setPosition(1.f, 1.f);

}

Game::~Game()
{
//std::cout << "DESTRUKTION Spiel Geschlossen" << std::endl;
}

void Game::Run()
{
sf::Clock clock;
sf::Time timeSinceLastUpdtade = sf::Time::Zero;
while (Window.isOpen())
{

ProcessEvents();
Update(timeSinceLastUpdtade);
UpdateStatistics(timeSinceLastUpdtade);
Render();

sf::Time waitTime = TimePerFrame - timeSinceLastUpdtade;
sf::sleep(waitTime);
timeSinceLastUpdtade = clock.restart();

}

}

void Game::ChangeState(GameState newState)
{
switch (newState)
{
case MAINMENU:

//CurrentState = std::move(std::unique_ptr<GameState>(new MainMenuState));
//CurrentState = std::make_unique<GameState>();
CurrentState =std::make _unique<MainMenu>();

// auto mMainMenuState = std::move(std::unique_ptr<MainMenuState>(new MainMenuState));
break;


}
}


void Game::Update(sf::Time deltatime)
{
CurrentState -> Update(*this);
}

void Game::UpdateStatistics(sf::Time elapsedtime)
{
m_StatisticsUpdateTime += elapsedtime;
m_StatisticsNumFrame += 1;

if (m_StatisticsUpdateTime >= sf::seconds(1.f))
{
m_StatisticsText.setString("Frames / Secound =" + std::to_string(m_StatisticsNumFrame) + "\n" +
"Time/ Update =" + std::to_string(m_StatisticsUpdateTime.asMicroseconds() / m_StatisticsNumFrame) + "us");

m_StatisticsUpdateTime -= sf::seconds(1.f);
m_StatisticsNumFrame = 0;
}
}

void Game:: ProcessEvents()
{
while (Window.pollEvent(Event))
{
if (Event.type == sf::Event::Closed)
Window.close();
}
CurrentState->ProcessEvents(*this);
}

void Game::Render()
{
Window.clear();
Window.draw(m_StatisticsText);
CurrentState->Render&Window;
Window.display();
}



//Game.H

#pragma once

#include <iostream>
#include <sstream>
#include <memory>//für unique pointer
#include <SFML\Graphics.hpp>
#include "GameStates.h"
#include "MainMenuState.h"
//#include"Button.h"
//#include "Gui.h"

class GameState; //vorwärtsdeklaration
class Game
{

public:

Game();
~Game();
enum GameState { MAINMENU };
void Run();
void ChangeState(GameState newState);//
bool isRunning();

sf::RenderWindow Window;
sf::Event Event;
bool running;
bool hasFocus;

private:
void Update(sf::Time deltatime);
void UpdateStatistics(sf::Time elepsedTime);
void ProcessEvents();
void Render();

sf::Font m_TextFont;
sf::Text m_StatisticsText;
sf::Time m_StatisticsUpdateTime;
std::size_t m_StatisticsNumFrame;

static const sf::Time TimePerFrame;

private:
std:: unique_ptr <GameState> CurrentState;


};

Gamestates.h
#pragma once

class Game;//vorwärtsdeklaration
class GameState
{
public:

//Diese Funktion wird überschrieben werden, die von Game erben
// virtual heißt das diese klasse später überschrieben wird
// = 0 die Methode wird später durch die abgeleitetten Klassen definiert
virtual void Update(Game &game) = 0;
virtual void ProcessEvents(Game &game) = 0;
virtual void Render(sf::RenderWindow &Window) = 0;
virtual ~GameState() {};
};

7

26.03.2018, 12:28

Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler C2039 "ProcessEvents": Ist kein Element von "std::unique_ptr<Game::GameState,std::default_delete<_Ty>>" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 95
Fehler C2039 "Render": Ist kein Element von "std::unique_ptr<Game::GameState,std::default_delete<_Ty>>" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 102
Fehler C2039 "Update": Ist kein Element von "std::unique_ptr<Game::GameState,std::default_delete<_Ty>>" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 70
Fehler C2679 Binärer Operator "=": Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ "std::unique_ptr<MainMenuState,std::default_delete<_Ty>>" akzeptiert (oder keine geeignete Konvertierung möglich) Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 58
Fehler C2839 Ungültiger Rückgabetyp "Game::GameState *" für überladenen Operator "->" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 102
Fehler C2839 Ungültiger Rückgabetyp "Game::GameState *" für überladenen Operator "->" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 95
Fehler C2839 Ungültiger Rückgabetyp "Game::GameState *" für überladenen Operator "->" Star Wars c:\users\florian\documents\visual studio 2015\projects\sfml_game\sfml_starwars\star wars\star wars\game.cpp 70

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

26.03.2018, 12:29

1) Und MainMenuState.hpp sieht wie aus? (nutze bitte die cpp/code-tags)
2) enum GameState { MAINMENU }; vs class GameState - Also wenn das Tutorial SOWAS erzählt, such dir bitte ganz dringend ein neues!
Ein unique_ptr<enumType> hat natürlich nicht die Funktionen, die ein unique_ptr<classType> haben könnte. Daher kommen auch deine ganzen Fehler.

PS:
Es ist übrigens total uncool, dass "Game" die "GameStates" braucht und "GameState" das "Game". Solche zyklischen Abhängigkeiten lassen sich zwar durch Forward-Declarations technisch auflösen, sind aber semantisch ziemlich ungut.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (26.03.2018, 12:44)


9

26.03.2018, 13:03

#pragma once
//MainMenuState.h
#include "Game.h"
#include <memory>

class MainMenuState : public GameState
{
public:
MainMenuState();
~MainMenuState();

//Virtuelle Funktion die Überschrieben werden muss
void Update(Game &game);
void ProcessEvents(Game &game);
void Render(sf::RenderWindow &Window);


private:
void LoadAssets();

};

10

26.03.2018, 13:35

Danke euch allen und dir besonders BlueCobold die Fehler habe ich jetzt dank dir behoben...
welche andere Möglichkeiten habe ich für die Vorwärtsdeklarationen?

Werbeanzeige