C++执行一次序列的最佳方法
The best way to execute a sequence once in C++
使用C++ 一个序列只运行一次的最佳方法是什么?例如,为了更清楚地说明我有一个程序,您需要在其中猜测一个字符串,如果用户输入提示,我将显示单词的提示,但我只允许它一次......我目前正在这样做:
bool hintLock = false;
...
if (guess == "hint"){
if (!hintLock){
cout << hint << endl;
hintLock = true;
}
else
cout << "I've given you the hint" << endl;
}
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
void main(){
string guess;
bool hintLock = false;
cout << "Guess one of StackExchange's best site: Type "hint" for hint" << endl << endl;
do{
cout << "Guess > ";
cin >> guess;
if (guess == "hint"){ // Here it is
if (!hintLock){
cout << hint << endl;
hintLock = true;
}
else
cout << "I've given you the hint" << endl;
}
}
while (guess != "stackoverflow");
cout << "You've got it right!" << endl;
}
有没有更好的声明来做到这一点? 还是已经是最好的了?
我怀疑要么你过度分析了事情,要么你没有充分描述真正的问题。 从您发布的代码中,我认为您没有理由不将要执行的代码包装到函数中,然后简单地调用该函数一次。
void blahBlah()
{
// blah blah
}
int main()
{
if (userInput == "hint")
blahBlah();
}
也许你的意思是,在你的程序中,你有一个主循环,它一直执行到程序终止,在这个循环中你接受来自用户的输入。 允许用户请求提示,但在程序运行期间只能请求一次。 第一次要求提示时,他们会得到一个提示,但随后他们没有。
我仍然相信简单比花哨好(阅读:复杂)。 为此,我首先在主循环之外设置一个作用域bool
,每次他们寻求帮助时都会检查该范围:
int main()
{
bool displayedHint = false;
// program's main loop
for (bool endProgram = false; !endProgram; )
{
std::string command = getUserInput();
if (command == "hint")
{
if (displayedHint)
{
cout << "I already gave you a hint!n";
}
else
{
displayHint();
displayedHint = true;
}
}
}
}
如果你想确保它只在程序的任何特定运行中显示一次(任何比这更全局的东西都非常复杂且特定于 platfrom),你只需要一个全局布尔值来保护函数。例如:
bool shownHint = false;
void showHint() {
if (!shownHint) {
cout << "The hint is: ........" << endl;
shownHint = true;
} else {
cout << "Hint has already been shown, no cheating!" << endl;
}
每当您认为您可能想要显示提示时,请拨打showHint()
,它将根据需要显示(或不显示)。
诀窍是确保变量是全局的(或类中的静态变量,看起来几乎相同),以便在循环期间或程序运行时不会重置它。
如果需要在运行之间保留,则可以写入文件、检查服务器、设置注册表项或任意数量的其他选项。
我认为最合适的迭代语句是do-while。它允许至少一次迭代
例如
do
{
std::cout << "Enter your word: ";
std::string answer;
std::cin >> answer;
// some other stuff
} while ( false );
或
bool allow = true;
do
{
std::cout << "Enter your word: ";
std::string answer;
std::cin >> answer;
// some other stuff
} while ( allow = !allow );
布尔值flags
,表示系统中的状态。一旦状态被"定义",你就可以查询状态并找出它是"设置"还是"清除"。
更准确地说
bool hasHinted = false; // unset or cleared( also definition of a state variable)
if(hasHinted == false){
//do something
hasHinted = true; // set
}else{
// do nothing
}
我认为OP正在寻找一段类似于单例初始化的代码,即:只创建一次单例,之后始终返回指针。
void Init() {
static bool isInitialized = false;
if (!isInitialized) {
isInitialized = true;
doRealInit();
}
}
对std::call_once
所做的同样的事情作为评论建议:
std::once_flag flag;
void do_once() {
std::call_once(flag, [](){ std::cout << "Called once" << std::endl; });
}
在我看来,它并不是真的更具可读性或更短。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?