Finns det någon motsvarighet till VB's Collection, Byte och CallByName?
motsvarighet
21 svar · 484 visningar · startad av Nexus86
Re: motsvarighet
>>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.
>> Byte
unsigned char;
>>CallByName?
Ingen motsvarighet.
Re: Re: motsvarighet
Marcus E skrev:
>>CallByName?
Ingen motsvarighet.
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?
EDIT // http://www.webforum.nu/showthread.php?s=&postid=556131#post556131
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.
PeW skrev:
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.
En Collection är en enumarator (läs MSDN där exempel finns hur man definierar en enumerator).
En Byte är vän en char.
CallByName vet jag inte.
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.
Min idé om hur det kan göras i C++:
#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);
}
Edit: Glömde som sagt inkludera lite filer.
Tack så mycket! Nu undrar jag bara över en sak, vilka include's behövs för ovanstående?
#include<map> & #include <iostream>
*Samma stuk men utan includes ger inte mycket mer kod i C, heller ;) *
Tackar tackar!
Jojo.. Det förstog jag faktiskt.. :)
PeW: Vad menar du?
Nåt i stil med:
#define NO_OP 2
typedef struct {
char * op_name;
void (*operation)();
}funcOverall;
// funktion 1
void one(){
puts("Ett");
}
// funktion 2
void two(){
puts("Två");
}
// funktionslista
funcOverall callByName[NO_OP] =
{
{"one",one},{"two",two}
};
//strängjmfr
int StrCmp(const char *s1,const char *s2)
{
while(*(s2++)==*(s1++))
if(*s2=='\0' && *s1=='\0')
return 1;
return 0;
}
int main(){
unsigned char op[10];
int i;
do{
gets(&op);
// 3 rader för att plocka ut rätt funktion
for(i=0;i<NO_OP;i++)
if(StrCmp(callByName[i].op_name,op))
callByName[i].operation();
}while(!StrCmp(op,"q")); //kör till 'q' är inmatat
return 0;
}
Lägg gärna in ett break; efter callByName*.operation(); så undviks sökning i onödan.*
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
PeW skrev:
Visst är det lämpligt
Ehum... är det lämpligt med break?
http://www.webforum.nu/showthread.php?s=&postid=409151#post409151