【问题标题】:Correct Syntax for Updating a Classes Vector Elements更新类向量元素的正确语法
【发布时间】:2021-10-12 20:10:09
【问题描述】:

我有一个关于课程及其成员如何更新的问题。

所以基本上,我有一个简单的类

class Player
{
public:
    Player();
    std::vector <std::string> hand = {"r4", "r1", "g5"};
};

Player::Player()
{

}

我将这些类的实例添加到另一个向量中

std::vector <Player> players;

            Player p1;
            Player p2;

            players.push_back(p1);
            players.push_back(p2);

然后我尝试更新初始化类的向量存储类的向量

            //doesn't work
            //p1.hand.push_back("test1");
            //p2.hand.push_back("test2");

            //works
            players[0].hand.push_back("test1");
            players[1].hand.push_back("test2");

       for (int i = 0; i < 2; i++) 
            std::cout << players[i].hand[(players[i].hand.size() - 1)] << std::endl;

我很困惑为什么不使用第一种方法将测试字符串添加到 player 数组中的类的向量中。是不是因为它与我第一次初始化时的类实例不同?如果有人能为我澄清这一点,将不胜感激。谢谢!

【问题讨论】:

  • 好的,有道理,谢谢。但出于好奇,有没有办法将原件放入向量中?
  • 在处理 C++ 时改变您编写代码的方式。 C++ 不是 Java 或 JavaScript。拥有原始实例的令人信服的理由是什么?如果向量有它们,本地版本无论如何都会超出范围。
  • @tothemax,有几种方法可以解决。 std::vector&lt;std::reference_wrapper&lt;Player&gt;&gt; 将是“最干净的”,但非拥有引用的向量很少是正确的方法。
  • @PaulMcKenzie 是的,哈哈,我实际上只使用 JavaScript,所以我试图弄清楚这些东西在 C++ 中的工作方式。您有任何可以促进这种转变的书籍或资源推荐吗?
  • @tothemax 你可以从这里开始:stackoverflow.com/questions/388242/…

标签: c++ class vector


【解决方案1】:

在 C++ 中,(大部分)没有值类型与引用类型的对偶性。除非另有说明,否则一切都是值。

std::vector&lt;Player&gt;Player 实例的向量,而不是对Player 实例的引用列表。所以当你做players.push_back(p1);时,这必须对p1进行copy,这样vector中Player的实例就属于它了。

有很多方法可以获得引用向量,但这很少是可行的。非拥有引用容器的问题在于,您必须以某种方式绝对确定容器引用的每个实例都比容器本身的寿命长,这可能会变得非常棘手。

在像您这样的情况下,更典型的方法是让向量成为实例的所有者。如果你绝对必须有p1p2,它们可以是指向它的变量引用:

// Initialize the vector with 2 default-constructed players
std::vector <Player> players(2);

// ...

{
  Player& p1 = players[0];

  p1.hand.push_back("test1");
  p1.hand.push_back("test2");
  p1.hand.push_back("test3");
}

但是,您需要小心,因为如果您调整矢量大小,p1p2 将变为无效。

【讨论】:

  • 引用向量元素的问题是,如果调整了向量的大小,这些引用就会失效。
  • 好的,这有助于澄清很多,感谢您的评论。虽然,看到调整向量的大小会使元素无效,但这是不好的做法还是使用静态数组更合适?
  • @tothemax 移动到std::array 将从“你不应该调整大小”变为“你不能调整大小”。但真正的答案是局部变量引用应该是瞬态的。它们应该只存在您需要它们的短时间,这通常会被限制在一小段代码中,不会发生大小调整。
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多