Comment permettre à la fonction de modèle pour avoir des amis (comme) l'accès?
Comment modifier le code suivant pour permettre la fonction de modèle ask_runUI()
à utiliser s_EOF
sans faire s_EOF
public?
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
class AskBase {
protected:
std::string m_prompt;
std::string m_answer;
virtual bool validate(std::string a_response) = 0;
public:
AskBase(std::string a_prompt):m_prompt(a_prompt){}
std::string prompt(){return m_prompt;}
std::string answer(){return m_answer;}
static int const s_EOF = -99;
static int const s_BACKUP = -1;
static int const s_OK = 1;
int ask_user();
};
template<typename T> class Ask : public AskBase{
public:
Ask(std::string a_prompt):AskBase(a_prompt){}
bool validate(std::string a_response);
};
template<> bool Ask<std::string>::validate(std::string a_response){return true;}
template<> bool Ask<int>::validate(std::string a_response){int intAnswer;
return (std::stringstream(a_response) >> intAnswer);}
int AskBase::ask_user(){
for(;;){
std::cout << "Enter " << m_prompt;
std::string response;
getline(std::cin, response);
if (std::cin.eof())
return s_EOF;
else if (response == "^")
return s_BACKUP;
else if (validate(response)){
m_answer = response;
return s_OK;
}
}
return s_EOF;
}
template<typename T> int ask_runUI(T& a_ui){
int status = AskBase::s_OK;
for (typename T::iterator ii=a_ui.begin();
status!=AskBase::s_EOF && ii!=a_ui.end();
ii+=((status==AskBase::s_BACKUP)?((ii==a_ui.begin())?0:-1):1)
status = (*ii)->ask_user();
return (status == AskBase::s_OK);
}
int main(){
std::vector<AskBase*> ui;
ui.push_back(new Ask<std::string>("your name: "));
ui.push_back(new Ask<int>("your age: "));
if (ask_runUI(ui))
for (std::vector<AskBase*>::iterator ii=ui.begin(); ii!=ui.end(); ++ii)
std::cout << (*ii)->prompt() << (*ii)->answer() << std::endl;
else
std::cout << "\nEOF\n";
}
- La prochaine fois, veuillez utiliser
int ask_runUI()
(le ` marquer comme code). - Si vous êtes de retour le nombre, pourquoi devrait-il en être privé?
- J'ai développé l'exemple de montrer que seule AskBase::ask_user() renvoie s_EOF qui n'est utilisé que par ask_runUI().
Vous devez vous connecter pour publier un commentaire.
Si vous voulez un modèle de la fonction d'un ami, vous devez l'indiquer dans la déclaration de classe. Modifiez la ligne qui déclare l'ami de la fonction pour cela:
Maintenant, si votre classe est elle-même un modèle, les choses deviennent beaucoup plus compliquées. Modèle d'amis ne sont pas trivial à faire correctement. Pour cela, je vais vous référer à ce C++ FAQ Lite dit sur le sujet.
Cela a fonctionné pour moi!
La plus simple est probablement de remplacer
static int const
membres de l'énumération et plaisante pas avec lafriend
s: