簡體   English   中英

如何使用智能指針做到這一點?

[英]How can I do this with Smart Pointers?

這是我要實現的目標:

#include <iostream>
using std::cout;

#include <vector>
using std::vector;

int main()
{
    vector<int> a {3, 7};

    int *p = &a.at (0); //assign 3

    for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
    {
        p = (*p == a.at (0) ? &a.at (1) : &a.at (0));
        cout << *p << '\n';
    }
}

我想使用智能指針而不是原始指針,因為它們看起來更好,但無法真正弄清楚如何實現來回切換(這是用於在游戲中輪流使用;這是一種Player * )。

我嘗試在兩個單獨的測試中將此處的指針替換為std::unique_ptrstd::shared_ptr ,使用reset進行切換,並按預期在第一個之后給出了隨機數。

接下來,我嘗試了std::weak_ptr因為它看起來確實很像我所需要的,盡管界面實際上並不是那么相似。 從我所看到的,使用它的唯一方法是通過lock() ,所以我嘗試在lock().之前添加lock(). reset的調用並將其附加到取消引用,但是崩潰了。

我如何使用std::weak_ptr而不是原始指針,或者我實際上可以以某種方式使用其他之一?

我認為您應該考慮使用std::vector::iterator而不是使用這種類型的索引操作的原始指針,但要記住,對std::vector任何插入操作都可能使迭代器無效。 例如,您可以執行以下操作:

typedef std::vector<int>::iterator iter_t;

vector<int> a {3, 7};

iter_t p = iter_t(&a.at(0)); //assign 3

for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
    p = (*p == a.at(0) ? iter_t(&a.at(1)) : iter_t(&a.at(0)));
    cout << *p << '\n';
}

根據定義,智能指針並不是“好得多”。 只有在需要管理指向的內存時,它們才有用。

由於您的指針只是指向vector元素,因此根本不需要智能指針。 大多數智能指針在超出范圍時會嘗試刪除它們指向的內存,在這種情況下,這將導致鼻惡魔。

但是請注意,調整向量的大小可能會導致所有指針無效。 確保當指針仍在作用域內時,不要添加或刪除元素。

在這種情況下,玩家輪流玩,我可能根本不會使用指針,而是這樣的:

int main()
{
    vector<int> players {3, 7};

    int current_player = 0;

    while (!game_over())
    {
        cout << players[current_player] << '\n';
        current_player = (current_player + 1) % players.size();
    }
}

剛剛意識到,您可能意味着您想要一個指向向量中int的智能指針,而不是將向量中的int更改為智能指針。 我根本不會那樣做。 我會使用向量的迭代器:

for (int i = 0; i < 10; ++i) {
  auto it = it.begin() + (i % 2 ? 1:0);
  f(*it);
}

使用共享的,唯一的或任何其他指向向量內部的指針將導致不良,不良,不良情況。 也不保證使用原始指針,因為它們不指示任何有關所指向的內容。 另一方面,向量的迭代器雖然可能實現為原始指針,但具有明確的,已記錄的關於其使用的規則,您可以使用它們在代碼中進行記錄。

不要忘記“智能指針”包括迭代器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM