Archief - [PROG]-[C++] Strings en functies

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Kipp^Smith

Legacy Member
Is het mogelijk, zoals in PHP toch het geval is, strings te gebruiken als functienamen?

Bijvoorbeeld:

Code:
void ToonIets()
{
      cout << "Iets";
}

string VoerUit;
VoerUit = "ToonIets";
Kan ik nu ineens naar die functie te verwijzen, zodat ik niet met 1001 if's moet werken?

Zo liefst dus niet:

Code:
if(VoerUit == "ToonIets") ToonIets();

Reck

Legacy Member
ik heb geen flauw idee wat je vraagt, dus ik ga zeggen van niet. Het zou helpen als je zei wat je wilde bereiken :) .

MenDaxx

Legacy Member
Reck zei:
ik heb geen flauw idee wat je vraagt, dus ik ga zeggen van niet. Het zou helpen als je zei wat je wilde bereiken :) .

Volledig mee akkoord.
Misschien eens wat meer uitleg over wat je juist bedoeld?
grtz

MdX

Belgianbonzai

Legacy Member
volgens mij wil hij de uit te voeren functie als string opslaan...

hij heeft bvb 200 functies (methodes noemt da zeker?) elk met hun naam
en dan een string met als inhoud een van die namen

naargelang de naam in die string moet dan de juiste functie uitgevoerd worden...

anyways, programmeren is al te lang geleden bij mij, moet daar dringend weer es mee beginnen, ik kan dus nie antwoorden.

Krueger

Legacy Member
Cakeman zei:
Heb je geen case-statement in C++?
En daarmee zou je het probleem nog niet echt oplossen. Je moet nog altijd voor elke functie die er is, een regel schrijven. Zoals hij het wil, moet je met dat stukje code toekomen om uw functies aan te roepen. Ik ben aan het denken in de richting van pointers naar functies, maar het zit net allemaal iets te ver.

Reck

Legacy Member
Code:
#include <iostream>
using namespace std;

int main()
{
     char keuze[30];
     cin >> keuze;
     
     switch(*keuze)
     {
          case 'a': cout << "optie A";
                      break;
          case 'b': cout << "optieB";
                      break;
     }
     
     cin.get();
     cin.get();
     return 0;
}

Reck

Legacy Member
Krueger zei:
En daarmee zou je het probleem nog niet echt oplossen. Je moet nog altijd voor elke functie die er is, een regel schrijven. Zoals hij het wil, moet je met dat stukje code toekomen om uw functies aan te roepen. Ik ben aan het denken in de richting van pointers naar functies, maar het zit net allemaal iets te ver.
als hem echt wil kan hem nen hash array maken die gevuld is met functiepointers. Dan zou het moeten werken.

killgore

Legacy Member
dat zijn geen strings maar chars en aangezien chars als 8-bit integers kunnen behandeld worden is dit maar logisch :s.

Kipp^Smith

Legacy Member
In PHP is het iets met die dubbele dollartekens, maar het gebruik ervan ontglipt me even.

Code:
$testing = "Hallo";
$lalala = "testing";
echo $$lalala;
Wat dus, dacht ik, Hallo op uw scherm toverde.

Ik heb dit nodig voor een eigen console: elke input / elk commando is een string, maar elk commando hoort bij een functie in mijn C++-code.

Zo geef ik bijvoordbeeld 'uur' in in mijn console, en dan krijg ik bv. voor de variabele Commando = "uur"
Nu is er een functie void uur(), en die moet uitgevoerd worden wanneer ik in mijn console 'uur' typ.
Ik kan dit enkel doen door:
if(Commando == "uur") uur();

Ik wil dat hij de inhoud van Commando kan uitvoeren:
Commando();
Wat dan, als Commando = "uur", uur() geeft.

killgore

Legacy Member
hm, mssch zoiets doen:

klasse of zo maken die dit kan:

-een string associëren met een functie (bv: add("text",textfunctie);)
-een call functie heeft (bv. call("text", ...); ) ... zijn dan de parameters voor die functie.

zal wat gegoochel worden met containers of linked lists of arrays of whatever, ma dit is imho redelijke oplossing i.p.v. steeds te if/elsen (dynamischer imho).

wlibaers

Legacy Member
Niet meteen mogelijk in C++, je moet zelf een tabel (std::map misschien?) maken waarin elke geldige string met zijn commando (functiepointer of object) voorkomt. Een klasse Commando kan dan met de gewenste syntax gemaakt worden door overloading van de = en () operatoren.

Kipp^Smith

Legacy Member
wlibaers zei:
Niet meteen mogelijk in C++, je moet zelf een tabel (std::map misschien?) maken waarin elke geldige string met zijn commando (functiepointer of object) voorkomt. Een klasse Commando kan dan met de gewenste syntax gemaakt worden door overloading van de = en () operatoren.

Dat moet ge mij dan eens uitleggen.
Een map ken ik: de sleutel wordt dus een string, maar wat wordt de waarde ervan? Een 'functiepointer'? :confused:

map<string, ???> m;

En hoe wordt dat dan uitgevoerd?

Gewoon

m["tijd"];

?

Tell me. :)

Psychokillah

Legacy Member
Ik zie dat je blijkbaar de gewoonte hebt om met PHP te werken en nu enkele soortgelijke zaken probeert in C++ uit te voeren.

Wel ik ga u meteen vertellen dat C++ een vrij strenge type-checking uitvoert en dat in PHP helemaal niet bestaat. En die hebben beide in hun referentiekader hun voordelen(en ook nadelen).
In C++ is het zeer belangrijk(en anders gaat de compiler er gewoon niet door) dat ELKE variable een type-definitie krijgt, zodat ten alle tijden geweten is wat een zekere variable juist is. Hetgeen jij dus probeert standaard uit te voeren is dus onmogelijk. Met enkele omwegen kan je misschien wel iets soortgelijk bekomen(maar daar werd je al reeds mee geholpen blijkbaar)

Kipp^Smith

Legacy Member
Ik vraag mij gewoon af hoe een console dan in C/C++ geschreven wordt.

Ik heb iets in de aard van:

Code:
string commando;

cout << "Geef een commando op: ";
cin >> commando;

if(commando == "tijd") ToonTijd();
else if(commando == "datum") ToonDatum();

Die if's zijn zo belachelijk?!

S3cT0r

Legacy Member
Zoals iemand hier al vermeld had kan je mss een tabel genereren @runtime en dan een functie maken die opzoekt en uitvoert, je zal in ieder geval de functie zelf moeten linken met de string, anders gaat ni in C++ voorzover ik weet.

btw:

Code:
if(commando == "tijd") ToonTijd();
else if(commando == "datum") ToonDatum();

"tijd" en "datum" zijn unieke pointers naar strings in het geheugen, die zal nooit hetzelfde zijn als commando, gebruik strcmp().

wlibaers

Legacy Member
Ook alweer enkele jaren geleden dat ik me nog intensief met C++ bezig gehouden heb, ik moest het even opzoeken, maar dit zou het nodige moeten doen:

Code:
#include <string>
#include <map>
#include <iostream>

	
void f1()
{
	std::cout << "\nf1 gekozen\n\n";
}

void f2()
{
	std::cout << "\nf2 gekozen\n\n";
}

bool bstop = false;

void stop()
{
	bstop = true;
}

int main()
{
	std::string commando;
	std::map<std::string, void (*)()> commandolijst;
	commandolijst["f1"] = f1;
	commandolijst["f2"] = f2;
	commandolijst["stop"] = stop;

	while (bstop == false)
	{
		std::cout << "geef commando\n";
		std::cin >> commando;
		if (commandolijst.find(commando)!=commandolijst.end())
			commandolijst[commando]();
		else
			std::cout << "\nOngeldig!\n\n";
	}
	return 0;
}

Merk op dat het hoofdlettergevoelig is: het programma herkent f1, maar niet F1. Als dat een probleem is moet je een functor schrijven waarvan de operator () twee strings vergelijkt op de manier die jij wil, en die als derde parameter bij de initialisatie van de std::map geven.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan