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

Klasa Bazowa niezdefiniowana

Object Storage Arubacloud
0 głosów
1,731 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 (194,920 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 (194,920 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?
komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)
Pierwszy fragment kodu który wkleiłem nie jest definicją klasy Bonus?
komentarz 24 czerwca 2018 przez criss Mędrzec (172,590 p.)
Tak, ale jest niewidoczny w pliku w którym definiujesz PaddleStick która ma dziedziczyć z Bonus. Jest tam tylko deklaracja klasy Bonus, ale definicji nie widać.
komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)

A jak wcześniej dołączam stdafx w którym jest includ który dołącza ten plik to on go nie widzi? Dlaczego? Poradziłem się microsoft i zrobiłem tak 

class C{};  
class D : public C {};  

i błędów było tylko więcej bo to była pusta deklaracja gdybym przekleił tam definicję z Bonus.h i Bonus.h usunął to pewnie by działało, ale to nie jest jedyna klasa pochodzna po Bonus a poza tym to nie eleganckie tak w jednym pliku wszystkie trzymać. Wiesz jak "podlinkować" mu tą deklarację żeby z niej stworzył klasę pochodną?

komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)

@Criss, Proszę pomocy crying

1
komentarz 24 czerwca 2018 przez criss Mędrzec (172,590 p.)
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. I wtedy po prostu includuj plik z klasą Bonus czy czego tam potzrebujesz.
komentarz 24 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)

@Criss, myślałem, że tylko ja mam czasami tak, że wiem co oznacza coś po Angielsku ale nie wiem co po Polsku.. :P

komentarz 24 czerwca 2018 przez Asokus Początkujący (450 p.)

@Criss, Zrobiłem tak jak napisałeś, prekompilacja wyłączona stdafx wywalony we wszystkich plikach podpięte to co potrzeba. Dodatkowo deklaracje wystąpienia klas (nie wiem dlaczego pomimo podpięcia pliku nagłówkowego kompilator i tak chce deklarację klasy) i dalej te same błędy dokładnie dla klas które dziedziczą po bonusie. Na gita zuploudowałem aktualną wersję. Wiecie co mogę jeszcze zrobić?

1
komentarz 24 czerwca 2018 przez mokrowski Mędrzec (155,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 (155,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 82 wizyt
pytanie zadane 11 lutego 2021 w Sprzęt komputerowy przez koleś34 Gaduła (3,270 p.)
0 głosów
2 odpowiedzi 202 wizyt
pytanie zadane 11 stycznia 2021 w C i C++ przez szymonkozy Nowicjusz (140 p.)
0 głosów
1 odpowiedź 89 wizyt
pytanie zadane 8 października 2020 w Systemy operacyjne, programy przez Programmingc100 Bywalec (2,620 p.)

92,594 zapytań

141,443 odpowiedzi

319,714 komentarzy

61,980 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...