Øsse Skrevet 7. september 2010 Del Skrevet 7. september 2010 (endret) I mitt program har jeg et objekt som fungerer som interface mellom programmereren og numerisk løsning av differensialligninger. Når det deklareres sendes det med en struct som forteller hvilken metode den skal bruke. Eksempel med fjerde ordens Runge-Kutta. ODEsolver< RK4 > solver(/*parametre*/); solver.Integrate(); RK4 er en egen struct. Det er også andre og jeg har flere løsningsmetoder jeg skal teste på samme fysiske problem og jeg vil kunne sette inn hvilken metode jeg vil bruker basert på input fra brukeren eller en configfil. Jeg klarer ikke å se hvordan jeg skal gjøre dette. For å skissere hva jeg har lyst på: if (input=="RK4") { #typedef placeholder RK4 } ODEsolver<placeholder> solver(/* parametre */); Her blander jeg åpenbart direktiver med øvrig kode og alt er på trynet, men jeg illustrerer hva jeg har lyst på Er det noen som vet hvordan jeg kan løse dette? Endret 7. september 2010 av Øsse Lenke til kommentar
[kami] Skrevet 7. september 2010 Del Skrevet 7. september 2010 I mitt program har jeg et objekt som fungerer som interface mellom programmereren og numerisk løsning av differensialligninger. Når det deklareres sendes det med en struct som forteller hvilken metode den skal bruke. Eksempel med fjerde ordens Runge-Kutta. ODEsolver< RK4 > solver(/*parametre*/); solver.Integrate(); RK4 er en egen struct. Det er også andre og jeg har flere løsningsmetoder jeg skal teste på samme fysiske problem og jeg vil kunne sette inn hvilken metode jeg vil bruker basert på input fra brukeren eller en configfil. Jeg klarer ikke å se hvordan jeg skal gjøre dette. For å skissere hva jeg har lyst på: if (input=="RK4") { #typedef placeholder RK4 } ODEsolver<placeholder> solver(/* parametre */); Her blander jeg åpenbart direktiver med øvrig kode og alt er på trynet, men jeg illustrerer hva jeg har lyst på Er det noen som vet hvordan jeg kan løse dette? jeg tror heller jeg ville valgt en factory pattern, med arv her. med templates så må du jo kjenne typen som du sender med i <> parameterne dine (og det vil jo være dynamisk). Jeg er hvertfall ikke dreven nok med templates til å umiddelbart se løsning på problemet ditt vha templates. (og er ikke sikker på om det er noen god løsning på problemet ditt her) struct Base { virtual void Integrate() = 0; ... }; struct RK4 : public Base { virtual void Integrate() { ... } ... }; Base* likning; if (input == "RK4") { likning = new RK4( ... ); } else if (input == "meh") { likning = new MEH( ... ); } ODEsolver solver(likning); solver.Integrate(); ble kanskje litt rotete skrevet av meg det her, men jeg mener hvertfall at baseobjekter og arv høres ut som en grei løsning i dette tilfellet Lenke til kommentar
Øsse Skrevet 8. september 2010 Forfatter Del Skrevet 8. september 2010 Hei og takk for svar. Det du foreslår er sikkert mulig men jeg tror det vil involvere en enorm endring av koden min. Jeg bruker kode fra Numerical Recipes og jeg er ikke sikker på om jeg klarer å modifisere koden slik du foreslår. Jeg må i så fall lage en helt virtuell klasse som ODEsolver arver fra. Jeg kan formulere problemet mitt mye enklere, egentlig. Jeg vil at brukeren av programmet skal kunne velge om programmet skal deklarere en vector<int> eller en vector<double> baset på input til programmet. Lenke til kommentar
[kami] Skrevet 8. september 2010 Del Skrevet 8. september 2010 (endret) jeg tror du da må lage to if blokker.. if (input == "double") { vector<double> list; // all logikken her solve(list); } else if (input == "integer") { vector<int> list; solve(list); } finnes sikkert mer elegante løsninger der ute.. Men er sikkert mutlig, bare se hva de klarer i boost! Men jeg uansett er jeg ganske sikker på at compileren resolver templaten compile time, så jeg tror ikke det er mulig å gjøre var< input == "double" = double : float>.. (den syntaksen her vil aldri funke, men mer tanken altså) Men her er det godt mulig jeg tar feil. Endret 8. september 2010 av [kami] Lenke til kommentar
Øsse Skrevet 8. september 2010 Forfatter Del Skrevet 8. september 2010 Hei, og takk for svar igjen Det var akkurat det jeg var redd for, å ha flere svære if-blokker nedover. Det er jo ikke et problem egentlig. Jeg bare liker det ikke så godt Jeg skulle hatt en måte å deklarere objektet på før den første if'en. Det jeg kan gjøre er å opprette objekter for alle metodene med new , så sletter if'ene alle de andre den ikke trenger. Mitt program er jo såpass lite uansett at jeg kan sikkert ha hundrevis av ubrukte objekter rundt omkring. Jeg lurer mest på om det er en skikkelig måte å gjøre det på. Jeg har søkt på Google men har ikke funnet noe svar. Det du skrev over er det nærmeste jeg har kommet, men som sagt så tror jeg ikke at jeg får til å tilpasse den teknikken til mine klasser/structerr. Jaja Lenke til kommentar
ratata Skrevet 11. september 2010 Del Skrevet 11. september 2010 Problemet skal vel kunna løysast med litt arv og Factory Pattern? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå