Есть ли способ повторно объявить объект класса
Да. Вы можете объявить объект много раз. Но определите его только один раз (ODR - правило единого определения).
и использовать его потом через оператор if? [sic - ошибка грамматики]
В основном у вас есть 3 области видимости, которые перекрываются. Вот ваш код, в который я добавил фигурные скобки для уточнения областей.
int main(int, char**)
{ // scope 1 begin
int i=9;
potato a(i); // scope 1 potato ctor
if(i==3)
{ // scope 2 begin
potato a(5);
a.show(); // of potato in scope 2 (scope 1 potato is hidden)
} // scope 2 end
else
{ // scope 3 begin
potato a(3);
a.show(); // of potato in scope 3 (scope 1 potato is hidden)
} // scope 3 end
a.get_id();
a.show(); // show contents of scope 1
} // scope 1 end
Вы можете использовать область действия «1» для каждой области, если не скрываете и не скрываете объект:
int main(int, char**)
{ // scope 1 begin
int i=9;
potato a(i); // __scope 1 potato ctor__
if(i==3)
{ // scope 2 begin
// replace "potato a(5);" with
a.modify(5); // __modify scope 1 potato__
a.show(); // __of potato in scope 1__
} // scope 2 end
else
{ // scope 3 begin
// replace "potato a(3);" with
a.modify(3); // __modify scope 1 potato__
a.show(); // __of potato in scope 1__
} // scope 3 end
a.get_id();
a.show(); // show contents of scope 1
} // scope 1 end
В этой версии только 1 картошка является ctor'd (и dtor'd). И он изменяется один раз на значение, основанное на предложении if.