Как повторно объявить объект класса в C ++? - PullRequest
0 голосов
/ 06 мая 2018

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


}

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

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

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

Объекты a в блоках if-else являются объектами, отличными от предыдущих.Они создаются и уничтожаются в блоке if-else и не изменяют первый объект.

potato a(i);  // Object 1
if(i==3){
    potato a(5);  // Object 2. 
}
else
    potato a(3); // Object 3


a.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...