Я экспериментирую с классами и конструкторами и пытаюсь выбрать конкретное объявление для объекта класса в зависимости от чего-то вроде оператора if. Я написал простой пример, показывающий, что я пытался сделать, но он не работает. Несмотря на то, что он выполняет оператор if, он печатает «id» первого объявленного объекта, и если я не объявляю его перед оператором if, я получаю ошибку «не объявлено в этой области» для печати. Есть ли способ повторно объявить объект класса и использовать его впоследствии с помощью оператора if?
class potato{
private:
int id;
public:
void get_id(){
cout<<id<<endl;
}
potato(int x){
id=x;
}
};
int main(){
int i=9;
potato a(i);
if(i==3){
potato a(5);
}
else
potato a(3);a.get_id();}
a
объекты в if-else
блоки являются объектами, отличными от предыдущего. Они созданы и уничтожены в if-else
заблокировать и не менять первый объект.
potato a(i); // Object 1
if(i==3){
potato a(5); // Object 2.
}
else
potato a(3); // Object 3a.get_id(); // Still object 1
Если вы хотите изменить первый объект, используйте присваивание.
potato a(i); // Object 1
if(i==3){
a = potato(5); // Changes object 1.
}
else
a = potato(3); // Changes object 1.a.get_id(); // Should have new value
Есть ли способ повторно объявить объект класса
Да. Вы можете объявить объект много раз. Но определите его только один раз (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.