Как использовать указатель на объект из одной функции в другой функции?

У меня есть указатель на объект, который я буду использовать в одном методе. но мне нужно снова использовать тот же указатель в другом методе, как я могу достичь этого, не объявляя как глобальный объект. Это часть моего динамичного достижения
Shape является родительским классом, а Rectangle является дочерним классом.

int main(){
switch (choice){
case 1:
create();
break;
case 2:
process();
break;
}
}

create(){
Shape *shape[3];
shape[0]=&objRectangle;
}

process(){
for(int i=0;i<3;i++){
shape->print; // I want to acchieve like this.
}

Теперь я не могу сделать это, объект формы исчез, как только он выходит из процесса создания.
Пожалуйста помогите.

0

Решение

Я бы предложил, как и другие, позволить библиотеке управлять памятью за вас.

Для того, чтобы иметь возможность использовать динамическое связывание и std::vector Вы должны начать выделять (в своем основном) свой вектор как

    std::vector<Shape*> shape(3);

Таким образом, вы можете получить доступ к своим динамически связанным векторным записям как

    shape[0]->process();

Плохо то, что вам все еще приходится управлять памятью, на которую указывают векторные записи (на самом деле это всего лишь указатели C). Следовательно, почему бы тебе не подумать

    std::vector< std::tr1::shared_ptr< Shape > > shape(3);

?

Делая так, умный указатель std::tr1::shared_ptr освободит память для вас, когда указал Shape объект выходит из области видимости.

Более того, в этой настройке вы должны выделить Shapeобъекты типа как

     shape[0] = std::tr1::shared_ptr< Shape >(new Rectangle);

чтобы правильно создать умный указатель вам нужно.

Наконец, вектор shape должны быть переданы по ссылке (или const ссылка) на функции, использующие его.

1

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

Локальные переменные создаются на стек вызовов. Это означает, что эти переменные всегда уничтожаются при завершении функции.

Неясно, как вы получаете Rectangle объект и как вы обрабатываете массив Shape указатели на объекты из вставленного вами кода. Но вам, вероятно, нужны две вещи:

  1. Ваш Rectangle не должно быть в стеке, но оно должно быть размещено в куче.
  2. Вам нужен доступ к shape массив во всех местах, где вы хотите получить к нему доступ.

Я бы предложил вам создать класс, который обернет ваши функции и Shape объекты создаются и удаляются динамически с помощью new а также delete ключевые слова. Я считаю, что это самый простой способ. Примерно так должно работать:

/* interface */

class Example
{
Shape *shape[3];

public:

Example();
~Example();

void create();
void process();
};

/* implementation */

Example::Example() {}

Example::~Example()
{
delete shape[0];
}

void Example::create()
{
shape[0] = new Rectangle();
}

void Example::process()
{
shape[0]->print();
}

/* main */

int main()
{
Example example();
example.create();
example.process();
}
1

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