>>Finns det någon motsvarighet till VBs
>>Collection
Använd en array-klass, t.ex. STLs vector. Se dokumentationen eller sök på forumet för information om hur den används.
Använder du MFC, ATL eller BCB finns det andra klasser.
Du får ursäkta om detta låter tjurigt men som du skrev med frågetecken verkar du inte veta vad det är. Hur kan du då veta om det finns någon motsvarighet eller inte? Det råkar nämligen vara en väääldigt bra funktion. Den är nästan ett måste ibland. Speciellt om man försöker göra ett eget programmeringsspråk. Nån som vet nån?
Jag tolkar iaf Marcus E's "frågetecken" som att det frågetecknet följde med i copy-pasten från ditt inlägg - inte att han inte vet vad det är. ;)
Motsvarighet skulle isf vara allt från void-pekare till ren polyformism. Mao så går det att göra det som CallByName gör, men kanske inte med en redan implementerad metod/funktion. Denna "funktionalitet" är ju inget som ett programmeringsspråk tillhandahåller utan det är en konstruktion av språket - så även för VB.
Jag tolkar iaf Marcus E's "frågetecken" som att det frågetecknet följde med i copy-pasten från ditt inlägg
Så sant.
Faktum var att jag inte visste vad CallByName var, men jag gjorde en snabb sökning och fick fram att man med CallByName kan anropa funktioner efter deras namn som strängar. Just det finns det ingen motsvarighet för i C++. Däremot kan man gå till väga på andra sätt. T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning.
T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning
Vilket inte alls är ett ovanligt sätt att göra på, i exempelvis en kommando-tolk. I ren C används då void-pekare, i C++ har man ju fördelen att kunna binda med arv.
Då ber jag än en gång om ursäkt för min tjurighet. :r
Marcus E skrev:
T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning.
Då behöver man ju en switch eller if. Det var det jag ville slippa. D.v.s med så lite kod som möjligt.
Det behövs inte mycket kod heller och definitivt ingen switch -sats. Det funkar bra att i en loop iterera en lista med funktioner.. kodsnutten blir kanske 3 rader lång ;)
Det du ser i VB är en vad du tycker smidig lösning. Men i bakgrunden är det samma sak.. och i C/C++ bygger man ofta upp egna bibliotek med liknande lösningar och implementerar dessa när så behövs. Man behöver mao inte uppfinna hjulet flera ggr.
#include <map>
#include <iostream>
#include <string>
int mul(int a, int b)
{
return a*b;
}
int add(int a, int b)
{
return a+b;
}
//etc. etc. etc...
int main()
{
using namespace std;
//CallByName i C++
map<string, int(*)(int,int)> CallByName;
//Initera lista - ett måste
CallByName["mul"] = mul;
CallByName["add"] = add;
//Nu kan vi använda call by name
string op;
int a,b;
cout << "Skriv in "tal1 op tal2" där op=(add,mul,div,sub... etc.)";
cin >> a >> op >> b;
cout << a << " " << op << " " << b "= ";
//Här anropar vi CallByName
cout << CallByName[op](a,b);
}
Visst är det lämpligt, speciellt om man bygger på med många funktioner. Koden är bara ett (dock fungerande) exempel på liknande förfarande som det ovanför, fast i ren C.
Men eftersom C++ istort sett är bättre på allt är Sang-drax exempel ändå snyggare :e