簡體   English   中英

std::cout 不打印

[英]std::cout is not printing

當我使用std::cout打印出來時,它不會向終端打印任何內容:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

std::string multiplystr(std::string string, int mult) {
    for (int i = 1; i < mult; i++)     {
        string = string + string;
    }
    return string;
}

class entry {
public:

    entry(int width) {
        int frameWidth = width;
    }

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth + 4));
    std::string justout = frame + '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout.flush();
    cout << "out1" << std::endl;
}

但是,如果我刪除除 print 語句之外的所有內容,它會正確打印。 你知道它為什么這樣做嗎?

我還使用了std::flush但它不起作用。

您的代碼有未定義的行為,所以字面上任何事情都可能發生1

在您的entry class 中,構造函數主體將其輸入width值分配給名為frameWidth局部變量,該變量隱藏同名的 class 成員。 因此,永遠不會初始化frameWidth成員。

然后在初始化frame成員時將frameWidth成員傳遞給multiplystr()mult參數。 frame成員在構造函數體開始運行之前就已經初始化了,所以即使你修復了構造函數體以擺脫局部變量並將width值正確地分配給frameWidth成員,到那時已經來不及了,損害已經完畢。

1 :在我的測試中,當我運行代碼時,在到達 print 語句之前出現運行時錯誤,因為mult最終是一個非常大的值,導致循環崩潰可用 memory。

要解決此問題,您需要在構造函數的初始化列表而不是構造函數主體中初始化frameWidth成員。 初始化列表將在初始化frame成員之前初始化frameWidth ,因此在調用multiplystr()之前。

嘗試這個:

#include <iostream>
#include <vector>
#include <string>

std::string multiplystr(std::string s, int mult) {
    for (int i = 1; i < mult; i++)     {
        s += s;
    }
    return s;
}

class entry {
public:

    entry(int width) : frameWidth(width) {}

    int frameWidth;
    std::string framechar = "-";

    std::string frame = multiplystr(framechar, (frameWidth + 4));
    std::string justout = frame + '\n';
};

int main() {
    entry x1(15);
    std::string out1 = x1.frame;
    std::cout << "out1 = " << out1 << std::endl;
}

在線演示

暫無
暫無

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

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