When I print out using std::cout
, it doesn't print anything to the terminal:
#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;
}
However, if I delete everything except the print statement, it prints properly. Do you know why it does this?
I also used std::flush
and it does not work.
CodePudding user response:
When I run the program it prints everytime. I do not see the problem, are you actually compiling?
CodePudding user response:
Your code has undefined behavior, so literally anything could happen 1.
In your entry
class, the constructor body is assigning its input width
value to a local variable named frameWidth
which shadows the class member of the same name. As such, the frameWidth
member is never initialized.
You are then passing the frameWidth
member to the mult
parameter of multiplystr()
when initializing the frame
member. The frame
member is initialized before the constructor body begins running, so even if you fixed the constructor body to get rid of the local variable and assign the width
value to the frameWidth
member correctly, by then it is too late, the damage has already been done.
1: In my test, when I run the code, I get a runtime error before the print statement is reached, because mult
ends up being a very large value that causes the loop to blow up available memory.
To fix that, you need to initialize the frameWidth
member in the constructor's initialization list instead of the constructor body. The initialization list will initialize frameWidth
before the frame
member is initialized, and thus before multiplystr()
is called.
Try this:
#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;
}
CodePudding user response:
what are you trying to do?, what i see is that fixing the last line cout << "out1" << std::endl;
with cout << out1 << std::endl;
it will print. You are using the out1 variable name as a string.