"Переменные, объявленные в условном выражении, выходят за пределы области в конце условного выражения?"
Да - область действия локальной переменной находится только в квадратных скобках:
{
int x; //scope begins
//...
}//scope ends
//x is not available here
В вашем случае, скажем, у вас есть class A
.
Если вы не имеете дело с указателями:
A a( condition ? 1 : 2 );
или если вы используете другой прототип конструктора:
A a = condition ? A(1) : A(2,3);
Если вы создаете экземпляр в куче:
A* instance = NULL;
if ( condition )
{
instance = new A(1);
}
else
{
instance = new A(2);
}
или вы можете использовать троичный оператор:
//if condition is true, call A(1), otherwise A(2)
A* instance = new A( condition ? 1 : 2 );
EDIT:
Да, вы могли бы:
A* x = NULL; //pointer to abstract class - it works
if ( condition )
x = new B();
else
x = new C();
EDIT:
Кажется, вы ищете фабричный шаблон (посмотрите):
class A; //abstract
class B : public A;
class C : public A;
class AFactory
{
public:
A* create(int x)
{
if ( x == 0 )
return new B;
if ( x == 1 )
return new C;
return NULL;
}
};