微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类方法中的 Cout 什么都不做

如何解决类方法中的 Cout 什么都不做

我有一个“烧杯”类,它代表一个有 n 个面的 n 个骰子的烧杯。它有一个方法“roll”,它返回一个包含 n 个元素的向量,其中每个元素代表一个骰子。然后我有一个类“板”,它现在只打印 beaker.roll 使用 cout 生成的值;

所以我调用 beaker.roll 函数来传递结果来打印它们,但它什么也不做。我没有编译错误/智能感知警告。我做错了什么?

#include <iostream>
#include <random>
#include <chrono>
#include <thread>
#include <vector>

using std::cout;
using std::vector;


class beaker {
    public:
        int diceCount,diceFaces;
        
        beaker() {
            diceCount = 2;
            diceFaces = 6;
        };

        beaker(int count,int faces) {
            diceCount = count;
            diceFaces = faces;
        };

        //Dice values
        vector<uint8_t> dice;

        //METHODS

        //RETURN DICE i VALUE
        int diceValue(int d) {
            return dice.at(d-1);
        }
        //ROLL DICE + RETURN RESULT
        vector<uint8_t> roll() {
            std::mt19937 mt(std::chrono::high_resolution_clock::Now().time_since_epoch().count());
            std::uniform_int_distribution<int> dist(1,diceFaces);
            for (int i=0; i<diceCount; i++) {
                dice.push_back(dist(mt));
            }
            return dice;
        }       

        //RETURN LAST DICE NUMBERS
        vector<uint8_t> result() {
            return dice;
        }
};

class board {
    public:
        void Print(vector<uint8_t> dice) {
            for (int i=0; i<dice.size(); i++) {
                cout << dice.at(i);
            }
        }
};

int main() {
    beaker beaker;
    board board;
    board.Print(beaker.roll());
}

解决方法

问题是 dice 中的值属于 uint8_t 类型,cout::<< 运算符将其解释为 unsigned char,因此它将值打印为 ASCII人物。但是,这些值在 1 到 6 之间,并且 ASCII characters less than 32 大部分是非打印字符,因此它们在输出中不可见。

要说服 cout::<< 运算符将值打印为整数,请将代码更新为:

void Print(vector<uint8_t> dice) {
    for (int i=0; i<dice.size(); i++) {
        cout << static_cast<int>(dice.at(i));
    }
    cout << std::endl;  // just to make sure the buffer gets flushed ASAP
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。