- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C++ 的新手,这是我第一次发帖(灾难的秘诀)。我花了大约一天的时间来解决我的问题/问题,同时在论坛上找不到容易识别的解决方案。有可能我的问题已经被问到,或者解决方案已经发布,但我忽略了它或误解了它。存在类似的帖子 here ,但我不清楚如何处理这些信息。
我将提供这段代码要点的简明、高级摘要。然后,我将提出我无法找到答案的具体问题,然后我将遵循我编写的代码。
总结:我正在创建一个程序来帮助为游戏做簿记。游戏可能有任意数量的玩家,每个玩家都有一小部分属性/成员(例如 playerName、playerAllegiance 等),这些是 Player 类/对象的元素。首先要求用户输入每个玩家的名字 (enteredName),程序必须为每个输入的名字创建一个新的 Player 对象。这似乎可以由动态数组适本地处理,所以我选择使用一个 vector (称为 playerIndex)来存储每个 Player 对象。 for 循环允许用户输入名称,每个名称实例化一个新的 Player 对象,该对象将使用 vector::push_back 存储(复制?)到 playerIndex 中。在 for 循环结束时,应该为用户留下一个 Player 对象 vector ,每个 Player 对象在其 playerName 成员中存储一个名称。
问题/问题:在上述 for 循环中监视 vector 时,代码似乎可以正常工作。在用户输入第 N 个玩家的名字后,程序立即使用 Player 类函数 getPlayerName() [实际代码:playerIndex[playerCounter].getPlayerName()] 吐出存储在 playerIndex 的第 N 个元素中的 playerName 字符串。一旦用户输入了一个空白的 playerName(即在没有输入名字的情况下按回车),这表明用户已经输入了所有玩家的名字,因此 for 循环终止。在此循环之后,旨在输出存储在 playerIndex 中的每个 Player 对象的 playerName 的循环不会输出预期的名称。我不知道为什么会这样,但根据我对构造函数的极少了解,我猜它与 Player 类的复制或移动构造函数有关。谁能清楚地解释如何处理这个问题?我担心我可能犯了一个愚蠢得可怜的新手错误和/或误解了 C++ 的一个关键概念。
代码:此代码被裁剪/简化为尽可能清晰。例如,Player 类显示只有一个成员 (playerName),而在原始代码中,它有四五个其他成员。
//HeaderPlayerClass.hpp
#include <iostream>
#include <string>
#ifndef PLAYERCLASS_HPP
#define PLAYERCLASS_HPP
using std::string;
class Player {
private:
string *playerName;
public:
Player();
Player(string);
~Player();
string getPlayerName();
};
#endif
//PlayerClass.cpp
#include "HeaderPlayerClass.hpp"
#include <iostream>
#include <string>
using std::string;
Player::Player() {
playerName = new string;
}
Player::Player(string enteredName) {
playerName = new string;
*playerName = enteredName;
}
Player::~Player() {
delete playerName;
}
string Player::getPlayerName() {
return *playerName;
}
//main.cpp
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include "HeaderPlayerClass.hpp"
using std::cin;
using std::cout;
using std::string;
using std::vector;
int main(int argc, char** argv) {
string buffer;
vector<Player> playerIndex;
int playerCounter = 0;
for(;;) {
if(playerCounter==0) {
cout << "\nEnter player name and press enter; leave blank and press enter to continue.\n";
}
cout << "\nPlayer " << playerCounter+1 << ":";
getline(cin, buffer);
if(buffer == "esc") {
cout << "PROGRAM EXITED BY USER\n";
return 0;
}
if(buffer.empty()) {
break;
}
playerIndex.push_back(Player(buffer));
cout << "Player " << playerCounter+1 << "'s name:" << playerIndex[playerCounter].getPlayerName() << "\n";
++playerCounter;
}
for(int ii = 0 ; ii < playerIndex.size() ; ii++) {
cout << "\nThis should display player " << ii+1 << "'s name:" << playerIndex[ii].getPlayerName();
}
return 0;
}
最佳答案
class Player {
private:
string *playerName;
不存储指向字符串的指针,存储字符串本身
class Player {
private:
string playerName;
构造函数
Player::Player() {
playerName = new string;
}
如果您存储字符串本身,这是不必要的 - 默认构造函数将为您初始化它。
这就是问题开始的地方 - 这将使您容易受到内存泄漏的影响,除非您仔细编写析构函数
Player::Player(string enteredName) {
playerName = new string;
*playerName = enteredName;
}
所有你需要的,如果你存储字符串本身:
Player::Player( const string& enteredName)
: playerName ( enteredName )
{}
你的构造函数真的很可怕。当您存储字符串本身时,只需将事情留给默认析构函数即可
Player::~Player() {
delete playerName;
}
接下来,您太努力工作了,无法保留自己的柜台。 std::vector 维护自己的计数并使用
playerIndex.size()
会省去麻烦和bug
关于c++ - 在 vector 中正确存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441544/
我有这个析构函数,它在运行时产生错误“vector 迭代器不可取消引用”。 gridMatrix 是一个 std::vector * > * > * > * > 我添加了 typename 和 typ
我有一个 vector 的 vector ,比方说 std::vector > my2dArray; 现在我想要一个 vector ,其中包含 my2dArray 中 vector 的大小。手动这看起
假设我有一些 vector :v1、v2、v3 假设我还有一个 vector 来保存这些 vList = {v1, v2, v3} 如果我同步了 (vList),这是否意味着 v1、v2 和 v3 也
我正在创建一个 char 的二维 vector 数组作为类变量,但我在将 vector 添加到 vector 数组中时遇到了麻烦。 我正在使用 C++ 11 标准运行 gcc。 我尝试使用 vecto
如何修改 Vec基于 Vec 中某项的信息没有对向量的不可变和可变引用? 我已尝试创建一个最小示例来演示我的特定问题。在我的真实代码中,Builder struct 已经是其他答案提出的中间结构。具体
这个问题在这里已经有了答案: What is the idiomatic Rust way to copy/clone a vector in a parameterized function? (
在我的程序中,我有一个整数 vector 的 vector 。现在我想从 vector 的 vector 中取出一个 vector 并在另一个 vector 容器中对其进行操作,但是我得到了错误...
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
我有一个函数,该函数应使用来自字符串类型的给定 vector vector 中的某些元素初始化来自字符串类型的空 vector vector 。我的语法看起来像这样 std::vector> extr
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
这里有很多类似的问题,但我没有真正找到任何可以特别回答我的问题的问题。 我有一个 vector 的 vector 作为类的属性。另一个属性是 bucket_count。我想将 vector 的 vec
如果我像这样创建一个 vector 的 vector : std::vector> myVectorOfVectors; 然后用一些东西填充它: std::vector myVector1; myVe
我正在用 C++ 编写自定义 vector 类。我对这样的代码有疑问: vector vec; vec.push_back(one); vec.push_back(two);
这是我发布的问题 c++ program for reading an unknown size csv file (filled only with floats) with constant (b
vector> a; for (int i=0;i v(i+1); iota(v.begin(),v.end(),1); a.push_back(v); } a.erase(a.beg
也许已经晚了,但我不明白为什么我会得到一个超出此代码范围的 vector 下标: int m = 3; int n = 2; std::vector> path(m, std::vector(n, 0
这个问题真的很奇怪,我似乎找不到任何导致它的原因。 所以这里有一个赋值运算符重载函数,鸟类和哺乳动物都是 vector 。 (下面是类) const Register& Register::opera
我怎么去 std::vector> 只是 std::vector> ?有真正有效的方法吗? 最佳答案 我会做这样的事情: #include #include int main() { //
我正在尝试将这些 vector 中的一些数据写入文本文件。当我运行代码时,它返回运行时错误。 Category、Product、Cart、Customer和Address都是struct 包含每个 g
显然它会因您使用的编译器而异,但我很好奇执行 vector> 时的性能问题与 vector*> ,尤其是在 C++ 中。具体来说: 假设您的外部 vector 已满,您想要开始将元素插入到第一个内部
我是一名优秀的程序员,十分优秀!