Давайте предположим, что у меня есть некоторые C++ абстрактного класса и все его наследственные классы имеют различные конструктор:аргументов командной строки для различных конструкторов
class Abstract{
//don't worry, there is some pure virtual method here
}
class A : public Abstract {
public:
A (int Afirst, std::string Asecond, int Athird) {...}
...
}
class B : public Abstract {
public
B (double Bfirst, std::int Bsecond) {...}
...
}
class C : public Abstract {
public
C (std::string Cfirst, double Csecond, int Cthird, float Cfourth) {...}
}
Как вы можете видеть, все наследуется класса есть (возможно) различные конструкторы.
Теперь я хочу написать общий main()
, что-то вроде:
int main (int argc, char *argv[]){
if(argc < 2){
std::cerr<<"Too few arguments!"<<std::endl;
exit(1);
}
std::string type = argv[1];
Abstract *abs;
if(!type.compare("A"){
if(argc < 5){
std::cerr<<"Too few arguments for A!"<<std::endl;
exit(1);
}
abs = new A(atoi(argv[2]), argv[3], argv[4]);
}
//similar for B, C, D
}
Интересно, есть ли лучший способ сделать это, например, проходящие непосредственно char *argv[]
каждый конструктор и сделать все проверки внутри конструктор (и, в конечном счете, бросает исключение, как описано here).
Вы не сможете выйти из того, чтобы проверить, если аргументы соответствуют заданной конструктор имхо, но я бы не загрязнять классы контрольный код. Я бы написал фабричную функцию, которая принимает 'argc' и' argv' и возвращает экземпляр соответствующего класса. Это будет содержать проверочный код. – Unimportant