0

1つのメソッドで使用するオブジェクトへのポインターがあります。しかし、別のメソッドで同じポインタを再度使用する必要があります。グローバルオブジェクトとして宣言せずにこれを実現するにはどうすればよいですか。これは私の動的入札実績の一部です。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.
}

今、私はこの原因を行うことができません、それが作成プロセスを終了すると、シェイプオブジェクトは消えます。手伝ってください。

4

2 に答える 2

1

ローカル変数はコール スタック上に作成されます。つまり、関数が終了すると、これらの変数は常に破棄されます。

オブジェクトを取得する方法と、貼り付けたコードからオブジェクト ポインターRectangleの配列をどのように処理するかは不明です。Shapeしかし、おそらく次の 2 つのものが必要です。

  1. Rectangleスタック上にある必要はありませんが、ヒープに割り当てる必要があります。
  2. shapeアクセスしたいすべての場所でアレイにアクセスする必要があります。

関数をラップし、andキーワードShapeを使用してオブジェクトを動的にインスタンス化および削除するクラスを作成することをお勧めします。これが最も簡単な方法だと思います。このようなものが動作するはずです:newdelete

/* 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();
}
于 2012-10-23T19:31:46.120 に答える
1

他の人がそうであるように、ライブラリにメモリを管理させることをお勧めします。

動的バインディングを使用できるようにするには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参照) によって、それを使用する関数に渡される必要があります。

于 2012-10-24T08:54:26.380 に答える