Как повторно объявить объект класса в C ++?

Я экспериментирую с классами и конструкторами и пытаюсь выбрать конкретное объявление для объекта класса в зависимости от чего-то вроде оператора 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();}

1

Решение

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
2

Другие решения

Есть ли способ повторно объявить объект класса

Да. Вы можете объявить объект много раз. Но определите его только один раз (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.

0

По вопросам рекламы [email protected]