1

プロトタイプの C++ コンソール アプリケーションをセットアップしています。プログラムには、いくつかの仮想クラスとポインターなどが含まれています。プログラムがメイン関数の下のコード行に到達すると、プログラムはクラッシュします。そのポインタでメモリにアクセスすることと関係があると思います。

主要()

...
Player _player();  //new player object created
Actor *player = &_player;  //pointer to player created

...
//note player and get_inventory() are/return a pointer
{
 Inventory* a =  player->get_Inventory();
 a->set_testMe("testedMe");
 string result = a->get_testMe();
 cout << result << endl;
}

{
 Inventory* a =  player->get_Inventory();
 string result = a->get_testMe();  //This causes error
 cout << result << endl;
}
...

Actor.cpp //get_Inventory()

...
Inventory* Actor::get_Inventory()
{
    Inventory mInventory = this->actorInventory;
    Inventory * pInventory = &mInventory;
    return pInventory;
}
...

在庫.cpp

...
Inventory::Inventory()
{
this->testMe = "initial test";
}

void Inventory::set_testMe(string input)
{
    this->testMe = input;
}
string Inventory::get_testMe()
{
    return this->testMe;
}
...

何か案は?ありがとう

4

1 に答える 1

1

これは、ローカル変数へのポインターを返します。

Inventory* Actor::get_Inventory()
{ 
    Inventory mInventory = this->actorInventory;
    Inventory * pInventory = &mInventory;
    return pInventory;
}

最初のステートメントthis->actorInventoryはローカル変数にコピーし (メソッドに対してローカルのようにget_Inventory)、そのローカル変数へのポインターを返します。から戻るとget_Inventory()、その変数はスコープ外になり、存在しなくなります。

this->actorInventoryポインタを直接返すことをお勧めします:

Inventory *Actor::get_Inventory()
{
    return &actorInventory;
}

または、呼び出し元が を変更したくない場合は、修飾されたポインターactorInventoryを返します。const

const Inventory *Actor::get_Inventory() const
{
    return &actorInventory;
}
于 2013-11-09T18:33:44.300 に答える