У меня есть указатель на объект, который я буду использовать в одном методе. но мне нужно снова использовать тот же указатель в другом методе, как я могу достичь этого, не объявляя как глобальный объект. Это часть моего динамичного достижения
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.
}
Теперь я не могу сделать это, объект формы исчез, как только он выходит из процесса создания.
Пожалуйста помогите.
Я бы предложил, как и другие, позволить библиотеке управлять памятью за вас.
Для того, чтобы иметь возможность использовать динамическое связывание и 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
ссылка) на функции, использующие его.
Локальные переменные создаются на стек вызовов. Это означает, что эти переменные всегда уничтожаются при завершении функции.
Неясно, как вы получаете Rectangle
объект и как вы обрабатываете массив Shape
указатели на объекты из вставленного вами кода. Но вам, вероятно, нужны две вещи:
Rectangle
не должно быть в стеке, но оно должно быть размещено в куче.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();
}