Ad esempio, ho bisogno che qualcosa dipenda dall'input dell'utente:
test.cpp
#include <iostream>
#include <fstream>
int main(){
std::string input;
std::cin >> std::noskipws >> input;
if(input=="A"){
std::cout << "A selected" << std::endl;
}else if(input=="B"){
std::ofstream myfile;
myfile.open ("test_log.txt");
myfile << time(NULL);
myfile.close();
std::cout << "time saved" << std::endl;
}else{
std::cout << "error" << std::endl;
}
return 0;
}
ora ha l'opzione A e B, e viola i principi chiusi aperti perché quando si aggiunge una nuova condizione, ad esempio: l'opzione "C", è necessario modificare l'istruzione if else in test.cpp. È possibile modificare il codice in modo che aggiungendo l'opzione "C" solo aggiungendo un nuovo file (classe) e non sia necessario modificare test.cpp?
Ho provato a racchiudere l'operazione in una classe template:
char a[]="A";
template<>
struct st<a>{
st(){
std::cout << "A selected" << std::endl;
}
};
e prova a chiamare il modello in main:
#include "A.h"
#include "B.h"
int main(){
std::string input;
std::cin >> std::noskipws >> input;
st<input.c_str()>();
return 0;
}
così che aggiungere una nuova opzione ha solo bisogno di aggiungere un nuovo modello, ma non è riuscito a compilare perché il modello può accettare solo una stringa costante, e anche funziona, aggiungere una nuova opzione richiede ancora di modificare test.cpp per aggiungere un nuovo # include la dichiarazione. È possibile aggiungere nuove opzioni definendo una nuova classe / nuovo file senza modificare il codice sorgente esistente?