C++ klasy a ładowanie dźwiękow

Nie nie zwracasz, tylko np tworzysz obiekt klasy audio gdzieś tam gdzie go tworzysz ustawiasz wszystko i przekazujesz go przez referencję do pozostałych klas które go używają. Prosty przykład jeśli tworzysz go w main():

main()
{
	Audio sterownik;
	
	sterownik.setWszystkoCoTamUstawiasz(co potrzeba);
	
	Module1 mod1(sterownik); //uzywajacy audio
	
	// implementacjia Module1 - konstruktor
	Module1(Audio & sterownik){
		this->ptrSterownik = & sterownik; // do jakiegos prywatnego wskazkina: private Audio * ptrSterownik
	}
	
	// lub jesli nie potrzebujesz tego sterownika juz w konstruktorze
	
	Module2 mod2;
	
	mod2.setSterownik(sterownik);
	
	// implementacjia Module2 - funkcji setSterownik
	setSterownik(Audio & sterownik) {
		// analogicznie do konstrutkora
	}
}

Jeśli na przykład tworzysz ten kontroler audio czy co to jest w innym module, a używasz w pozostałych modułach które są równoległe do właśnie tego moduły to musisz zwrócić wskaźnik do tego obiektu z modułu w którym go tworzysz.

Możliwości jest od groma, nie mam zamiaru na każdą możliwą sytuację pisać Ci przykładu. Proponuję abyś zapoznał się z jakimiś dobrymi materiałami do nauki programowania, ale do nauki programowania a nie konkretnego języka bo język może i znasz, ale z programowaniem masz ewidentnie problem.

Teraz to mi się dosłownie wszystko posypało. Potrzebuje wywołać Player w Engine właśnie z tą metodą przekazywania. Zrobiłem więc konstruktor taki, jak podałeś, ale teraz się pluje że klasa Player wcale się nie nazywa Player, w konsekwencji czego nie mam ostępu do funkcji. No trudno. W każdym razie dzięki. Najlepiej chyba dla całej branży będzie jak dam sobie spokój z tym wszystkim. W końcu nie wszyscy muszą być mistrzami, a żyć można z czego innego.

No chyba, że umieszczę funkcje dźwiękowe poza jakąkolwiek klasą. Wtedy załaduje je raz w jednym miejscu i chyba powinno być ok. Nieważne, że wszystko będzie miało dostęp do wszystkiego.

Ciężko cokolwiek powiedzieć bez przykładów i dokładnych błędów jakie Ci wypluwa kompilator. Na pewno nie ma się co poddawać, to że raz Ci nie wyszło nic nie znaczy. Wyciągasz wnioski doszkalasz się i lecisz dalej.

Nie możesz też użyć tego kodu z moich przykładów bo to tylko pseudo kod był i na pewno ma wiele błędów, wiele rzeczy uprościłem by pokazać Ci idee.
Tak jak wspomniałem Ciężko cokolwiek powiedzieć nie widząc kodu.

Cóż. Nikt również nie powiedział, ze wszystko zrobiłem zgodnie z tym, co wyjaśniłeś.
http://nvps.pl/0.zip
Chyba tam jest wszystko to, co było poprzednio.

Ja tu nie widzę żadnych zmian w stronę singletona. Wszędzie masz publiczny konstruktor i brak metody statycznej do pobierania instancji klasy.

Masz świadomość tego co robi konstruktor i jak działają metody statyczne czy właściwości?

Próbowałem zwrócić wskaźnik przez referencje. ZObacz engine.h

To co robisz nie ma najmniejszego sensu i nie jest tym o czym pisałem.

Jeśli tworzysz obiekt Audio w konstruktorze Engine to nie ma sensu przekazywać go przez referencję do tego samego obiektu.

Ta metoda jest zupełnie błędna

int Engine::installAudio(Audio &audio)
{
this->audio = &Audio;
}

ponieważ audio nie jest wskaźnikiem tylko obiektem klasy Audio, co sam zresztą napisałeś w Engine.h

Audio audio;

Aby Ci to zadziałało musiałbyś mieć

Audio * audio;

czyli wskaźnik do obiektu klasy Audio. Aby to miało sens gdzieś poza klasą do której chcesz przekazać taki obiekt musisz stworzyć obiekt tej klasy i przekazać go przez referencję.

Ostatnia kwestia, zwracanie wskaźnika przez referencję jest możliwe, ale bezsensowne w tym przypadku i w ogóle rzadko kiedy jest sens coś takiego robić. Musisz albo zwrócić wskaźnik do obiektu - gdy chcesz wydostać utworzony obiekt w innej klasie, albo przekazać go przez referencję by go wstrzyknąć do innego obiektu innej klasy. Zależnie od sytuacji i tego co chcesz zrobić albo zwracasz wskaźnik, albo przekazujesz go przez referencję.

Z tym, że wpisując Audio *audio; otrzymuje przy kompilacji bardzo podobne błędy do tych, co robiąc Audio audio;

Dobra, teraz to wygląda inaczej
make
g++ -c -I./include -I./headers -I./ -O2 -g -std=c++11 engine.cpp
In file included from engine.cpp:1:0:
./headers/engine.h:40:15: error: expected identifier before ‘&’ token
Player player(&audio);
^
engine.cpp: In constructor ‘Engine::Engine(sf::RenderWindow&)’:
engine.cpp:6:19: error: expected primary-expression before ‘)’ token
installAudio(Audio);
^
engine.cpp: In member function ‘int Engine::installAudio(Audio&)’:
engine.cpp:13:21: error: expected primary-expression before ‘;’ token
this->audio = &Audio;
^
engine.cpp: In member function ‘void Engine::start()’:
engine.cpp:32:1: error: ‘((Engine*)this)->Engine::player’ does not have class type
player.action();
^~~~~~
engine.cpp:43:35: error: ‘((Engine*)this)->Engine::player’ does not have class type
system.speech("%.2f, %.2f, %.2f", player.x, player.y, player.z);
^~~~~~
engine.cpp:43:45: error: ‘((Engine*)this)->Engine::player’ does not have class type
system.speech("%.2f, %.2f, %.2f", player.x, player.y, player.z);
^~~~~~
engine.cpp:43:55: error: ‘((Engine*)this)->Engine::player’ does not have class type
system.speech("%.2f, %.2f, %.2f", player.x, player.y, player.z);
^~~~~~
engine.cpp:47:21: error: ‘((Engine*)this)->Engine::player’ does not have class type
system.speech("%i", player.getHealth());
^~~~~~
engine.cpp:54:1: error: ‘((Engine*)this)->Engine::player’ does not have class type
player.update();
^~~~~~
engine.cpp:57:15: error: ‘((Engine*)this)->Engine::player’ does not have class type
audio->update(player.x, player.y, player.z);
^~~~~~
engine.cpp:57:25: error: ‘((Engine*)this)->Engine::player’ does not have class type
audio->update(player.x, player.y, player.z);
^~~~~~
engine.cpp:57:35: error: ‘((Engine*)this)->Engine::player’ does not have class type
audio->update(player.x, player.y, player.z);
^~~~~~
make: *** [Makefile:21: engine.o] Błąd 1
O ile oczywiście wszystko dobrze zrozumiałem. Że skoro wywołuję klasę Player w klasie Engine, bo tak być powinno, bo tak było wcześniej, to by miała dostęp do klasy Audio tak, jak zresztą następne klasy które będą wywoływane w klasie Engine, muszą mieć w konstruktorze przekazywany &Audio. Z tym, ze w takim razie funkcję installAudio można wyrzucić, bo Audio sam inicjalizuje, a w konstruktorze Player robię dokładnie to samo, co w installAudio w Engine.

No dokładnie tak, bo masz w tym momencie wskaźnik, a nie obiekt. W tedy musisz funkcje wywoływać z użyciem operatora wyłuskania -> a nie kropki.

Taka zmiana w kodzie jest dość istotna i jak najbardziej spowoduje konflikty z resztą kodu bo wymaga zmian nie tylko w jednym miejscu, sam dodałeś kolejne przykłady:

Player player(&audio);

nie możesz tak przekazać audio do konstruktora klasy Player bo jest wskaźnikiem a nie obiektem.

Jeśli nic Ci nie mówią pojęcia o których wcześniej wspominałem (zwracanie wskaźnika, przekazywanie przez referencję ewentualnie alternatywnie nazwane zwracaniem przez referencję) dodatkowo nie znasz wskaźników, nie wiesz co to i jak działa. Odpuść sobie te zmiany zanim nie uzupełnisz wiedzy. Bez tego nic nie ruszysz.

Dokładnie tak! Jak zrezygnujesz ze wskaźników na Audio w Engine i nie musisz przekazywać Audio do tyłu do maina tylko w głąb engine - do kolejnych obiektów które są inicjalizowane w engine to wystarczy że w konstruktorze przekażesz audio przez referencję - czyli wywalisz zmiany w Engine a w konstruktorze klasy do której chcesz wepchnąć Audio dodasz Audio $ audio.

Coś tak myślę, że stworzenie funkcji zwracającej rozdzielczość ekranu przez właśnie wskaźniki było prostrze.
teraz znów gcc pluje mi że niby chcę ponownie zadeklarować audio przekazując je do Player
Chyba serio pójdę coś poczytam, bo już z tego wszystkiego to nic nie mam w głowie.
Audio *audio;
Player player(audio); // redeclaration of audio he, tylko ciekawe jakim cudem

Dobra, mogę być z siebie dumny.
Zrobiłem coś, co nawet się kompiluje. Wyrzuciłem parametr z konstruktora i zrobiłem funkcję przyjmującą ten parametr Audio &a, wywołuje go za pomocą player.installAudio(*audio); bo inaczej się nie kompilował. Appka się uruchamia, ale przy próbie wczytania klasy Player się zawiesza i wyłącza. No trudno. Idę na Linuxa, by użyć debuggera.