mboost-dp1

C++ Argument liste


Gå til bund
Gravatar #1 - ipwn
27. okt. 2009 23:31
Hej. Sad lige og kogede lidt. Jeg har i lang tid kunnet tænke mig at have argumenterne fra et program i et bedre format, fordi char osv. er ikke særligt rart at lege med.

Men jeg ved ikke om dette er en god idé. Jeg kan snildt se et problem; andre klasser der skal bruge argumenterne, skal inkludere strukturen. Det kan jo selvfølgelig nemt gøres, men det er måske lidt for bøvlet så. Alternativt kan man lave en vector i main, men jeg syntes bare det er lidt rodet og ikke særligt genbrugeligt. (Det er også rart at man kan stole på at std::vector klare fejl mv.)

Så har lavet en klasse (struct fordi den kun er public) der blot tager imod argc og argv, og så ellers opfører sig som en vector container. Tænkte på list, men det er vel rart med lidt random access. Er ikke helt sikker; er list bedre? Det er jo potentielt farligt med random access. (Så sparer man også lidt hukommelse)

Og til slut; skal man bare nøjes med det gamle C? Tænker her især på når man skal bruge argumenter i andre classes; de kan jo risikerer at skulle blive sendt rundt en del.


// arguments.h
#include <algorithm>
#include <vector>
#include <string>

struct arguments : public std::vector<std::string> {
arguments(const int &c, char **v) {
this->reserve(c);
for (int i = 0; i < c; i++)
this->push_back(std::string(v[i]));
}
bool exists(const std::string &s) {
return std::binary_search(this->begin(), this->end(), s);
}
};



#include <iostream>
#include "arguments.h"

int main(int argc, char **argv) {
arguments arg(argc, argv);

for (arguments::iterator i = arg.begin(); i != arg.end(); ++i)
std::cout << *i << std::endl;

if (arg.exists("hello"))
std::cout << "User said hello." << std::endl;

return EXIT_SUCCESS;
}
Gravatar #2 - arne_v
27. okt. 2009 23:37
#1

Det største problem jeg ser er brug af binary_search uden at data er sorteret først!
Gravatar #3 - arne_v
27. okt. 2009 23:40
Andet:
* jeg ville overveje aggregation fremfor inheritance
* en hel del apps bruger getopt pakken til at tygge sig igennem argumenter
Gravatar #4 - ipwn
27. okt. 2009 23:59
#3 Jeg startede med aggregation, men så skal jeg skrive en del metoder for at den bliver brugbar; her er fordelen jo at man kan bruge iteratorer og diverse algoritmer, fordi den har en STL container som superklasse.

Getopt lyder interessant, den kendte jeg ikke. Men har heller ikke brugt særligt meget GNU. Jeg ved at win32 kan det samme. Der er dog problemer med compiler og library understøttelse går jeg ud fra.

Angående binary_seach så kan jeg jo ikke sortere dataen, fordi det er vigtigt at rækkefølgen på argumenter vedligeholdes. Den har bare en lineær kompleksitet her, hvilket vel er okay da antallet af argumenter aldrig er særligt store.
Gravatar #5 - arne_v
28. okt. 2009 00:53
ipwn (4) skrev:
Angående binary_seach så kan jeg jo ikke sortere dataen, fordi det er vigtigt at rækkefølgen på argumenter vedligeholdes.


God pointe.

ipwn (4) skrev:
Den har bare en lineær kompleksitet her, hvilket vel er okay da antallet af argumenter aldrig er særligt store.


Binary search virker ikke på usorteret data, så du skal bruge en anden metode. F.eks. find.
Gravatar #6 - arne_v
28. okt. 2009 00:54
ipwn (4) skrev:
Getopt lyder interessant, den kendte jeg ikke. Men har heller ikke brugt særligt meget GNU. Jeg ved at win32 kan det samme. Der er dog problemer med compiler og library understøttelse går jeg ud fra.


http://www.codeproject.com/KB/cpp/xgetopt.aspx
Gravatar #7 - arne_v
28. okt. 2009 00:54
Gravatar #8 - arne_v
28. okt. 2009 00:56
ipwn (4) skrev:
Jeg startede med aggregation, men så skal jeg skrive en del metoder for at den bliver brugbar; her er fordelen jo at man kan bruge iteratorer og diverse algoritmer, fordi den har en STL container som superklasse.


Det er netop al den funktionalitet der kommer med vector som er problemet.

En vector er mutable. Jeg vil mene at arguments klassen skal være immutable for at være en god OOP model af argumenterne.

Det er bedre at delegate den smule funktionalitet du skal bruge.
Gravatar #9 - ipwn
28. okt. 2009 09:01
Ooh, boost's features er lækre ud. Jeg bruger boost i forvejen.

Tusind tak for at vise mig i den rigtige retning :)

Og DOH. Nu ser jeg hvorfor binary search ikke virker. Divide and Conquer :P Ups.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login