• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa Bazowa niezdefiniowana

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,998 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez Asokus Początkujący (450 p.)

Wiecie dlaczego kompilator nie widzi mojej klasy bazowej? 

Klasa bazowa (wirtualna):

#pragma once
#include "stdafx.h"

class Game;

class Bonus
{
public:
	friend class BonusMenager;
	Bonus();
	virtual ~Bonus() = default;
	sf::Sprite obj;
	sf::Texture texture;
	sf::Vector2f gravity;
	sf::Vector2f moveVector;
	void update(float DetlaTime);
	void Draw(sf::RenderWindow & window);
	bool destTimer(float DeltaTime);
	bool getDestroyStatus();
	virtual void startAction() = 0;
	virtual void stopAction() = 0;
	virtual void action(float DeltaTime) = 0; // obsługa tego co się dzieje w trakcie akcji
protected:
	float destructionTimer;
	bool visibilyty;
	bool destructionStatus;
	Game* game;
};

Klasa Pochodna (jest zaznaczenie ze klasa Bonus się pojawi):

#pragma once
#include "stdafx.h"

class Game;
class Bonus;

class PaddleStick :
	public virtual Bonus
{
public:
	PaddleStick(Game* ga, float x, float  y);
	virtual ~PaddleStick() = default;
	void action(float DeltaTime);
	void startAction();
	void stopAction();
};

dodatko w stdafx Bonus.h jest przed PaddleStick.h:

// stdafx.h: dołącz plik do standardowych systemowych plików dołączanych,
// lub specyficzne dla projektu pliki dołączane, które są często wykorzystywane, ale
// są rzadko zmieniane
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <thread>
#include <iostream>
#include <list>
#include <iterator>
#include <string>
#include <sstream>



// TODO: W tym miejscu odwołaj się do dodatkowych nagłówków wymaganych przez program


#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include "Game.h"
#include "Player.h"
#include "Ball.h"
#include "SlabMenager.h"
#include "Slab.h"
#include "Bonus.h"
#include "BonusMenager.h"
#include "BallMultipler.h"
#include "PaddleShrink.h"
#include "PaddleShuter.h"
#include "PaddleStick.h"
#include "PaddleTenter.h"
#include "SpeedAccelerant.h"

Nie wiem czy to ma znaczenie ale w konstruktorze PaddleStick korzystam z konstruktora klasy bazowej (wcześniej nie korzystałem i też nie widział Bazowej):

#include "PaddleStick.h"


PaddleStick::PaddleStick(Game * ga, float x, float  y) : Bonus()
{
	game = ga;
	texture.loadFromFile("PaddleStick.png");
	obj.setTexture(texture);
	obj.setOrigin(obj.getLocalBounds().width / 2, obj.getLocalBounds().height / 2);
	obj.setPosition(x, y);
}

void PaddleStick::action(float DeltaTime)
{
}

void PaddleStick::startAction()
{
}

void PaddleStick::stopAction()
{
}

i konstruktor klasy bazowej:

Bonus::Bonus()
{
	gravity = sf::Vector2f{ 0.0f, 20 };
	moveVector = sf::Vector2f{ 0.0f, -50.0f };
	destructionTimer = float{ 4.0f };
	visibilyty = bool{ true };
	destructionStatus = bool{ false };
}

Kompilator wyrzuca taki błąd "class": klasa podstawowa niezdefiniowana". Dodam, że gdy przerzucę Bonus.h w nieprawidłowe miejsce (za klasy pochodne) w stdaxf.h to błędów jest kilkadziesiąt razy więcej. Nie jest to dziwne ale może pomoże.

Link do całego projektu github:

https://github.com/Blauto/2d_Game/tree/master/Arcanoid/Arcanoid

Dziękuję za pomoc!

komentarz 24 czerwca 2018 przez j23 Mędrzec (195,260 p.)

Jaki jest sens dodawać do stdafx.h własne nagłówki, wiedząc, że w trakcie pisania projektu może się coś w nich zmienić?

komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)
żeby nie pisać "listy" potrzebnych klass za każdym razem, tylko stdafx na początku i nic więcej, a potem nowe klasy wrzucać do stdafx.h. Nie wiem czy dobrze zrozumiałem pytanie. Po prostu zawsze tak robiłem i działało, myślałem że można, a teraz się VC postawił.
komentarz 24 czerwca 2018 przez j23 Mędrzec (195,260 p.)
Ok, tylko jak dasz tam nagłówki, które zmieniasz dosyć często, to całą idee prekompilacji nagłówków szlag trafia, a przecież po to ten plik jest. Też powiedzmy sobie szczerze: ten twój projekt nie jest aż tak duży, żebyś musiał robić jakiś jeden zbiorczy nagłówek załączający wszystko.

1 odpowiedź

+1 głos
odpowiedź 24 czerwca 2018 przez criss Mędrzec (172,590 p.)
wybrane 24 czerwca 2018 przez Asokus
 
Najlepsza
Nie możesz dziedziczyć z niezdefiniowanej klasy i dokładnie to mówi ci kompilator. Bo.. na jakiej zasadzie miałoby odbyć się dziedziczenie skoro nie wiadomo jak wygląda klasa bazowa?
1
komentarz 24 czerwca 2018 przez mokrowski Mędrzec (156,460 p.)

"Obiema ręcyma" się podpisuję...

Najlepiej kompletnie wywal stdafx i wyłącz precompiled headers (po polsku chyba "prekompilowane nagłówki") w ustawieniach projektu, bo to więcej problemów robi niż z tego pożytku

WIęcej zyskasz prawidłowo dzieląc program i wykonując budowę wielowątkowo/wieloprocesowo. Przynajmniej na początkowym etapie zanim nie wyłonią się Ci kandydaci na takie nagłówki. A później sobie sprawdzisz czy warto.. 

komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)
Ale zrobiłem tak jak napisałeś dokładnie, i dalej są te same błędy. Kompletnie tego nie rozumiem... do jest jak 2 + 2 ~= 4 dla visuala chyba robię reinstal bo już nie  wiem  o co chodzi z tym stare projekty przestały mi się kompilować nawet...
komentarz 24 czerwca 2018 przez mokrowski Mędrzec (156,460 p.)
Ładnie go wyłącz (VS). Zrób restart systemu i dopiero sprawdź czy stare projekty się kompilują. Jeśli nie to ustawiłeś coś co destabilizuje budowę wszystkich projektów. W menu chyba (z pamięci) Tools -> Import and Export Settings masz opcję resetu wszystkich ustawień. Nie reinstaluj bez potrzeby!
1
komentarz 24 czerwca 2018 przez criss Mędrzec (172,590 p.)
Masz tzw. circular dependency. Tzn. plik A includuje plik B, plik B includuje plik A. Wywal #include "Game.h" z Bonus.h (nie potrzebujesz definicji klasy Game żeby zadeklarować na nią wskaźnik) i daj tego includa w Bonus.cpp. Jeśli podobne problemy będą się działy, to szukaj circular dependency. Generalnie najlepiej jakby możliwie najwięcej #includów było w pliakch .cpp, skracasz w ten sposob czas kompilacji i pozbywasz się możliwości stworzenia chorego drzewa zależności z którego wychodzą takie kwiatki
komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)
Dziękuje teraz rozumiem, nie zdawałem sobie sprawy z możliwości wystąpienia takiego problemu, dziękuję za rady, będę stosował, jeszcze raz dziękuję za pomoc!

Podobne pytania

0 głosów
0 odpowiedzi 135 wizyt
pytanie zadane 11 lutego 2021 w Sprzęt komputerowy przez koleś34 Gaduła (3,270 p.)
0 głosów
2 odpowiedzi 333 wizyt
pytanie zadane 11 stycznia 2021 w C i C++ przez szymonkozy Nowicjusz (140 p.)
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 8 października 2020 w Systemy operacyjne, programy przez Programmingc100 Bywalec (2,620 p.)

93,187 zapytań

142,203 odpowiedzi

322,017 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2301p. - CC PL
  5. 2269p. - Tomasz Bielak
  6. 2235p. - Łukasz Siedlecki
  7. 2232p. - rucin93
  8. 2169p. - Marcin Putra
  9. 2164p. - Adrian Wieprzkowicz
  10. 2006p. - Michal Drewniak
  11. 1901p. - Mikbac
  12. 1806p. - Dawid128
  13. 1744p. - rafalszastok
  14. 1734p. - Anonim 3619784
  15. 1487p. - Michał Telesz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...