У меня возникли проблемы с std::cout, std::stringstream и std::string.c_str(). В основном, кажется, что где-то что-то застревает в буфере, и я не знаю, как решить эту проблему.
Если вам не нравится читать код в StackOverflow, вот соответствующие ссылки на мой github: класс TLString, тестовый класс и модульный тест — и вы можете перейти к концу, где я формулирую свой более краткий вопрос.
В моем модульном тесте у меня есть следующий код:
Test <std::string> strtest; // A unit test object expecting strings.
Test <const char*> chtest; // A unit test object expecting const char*s
// ...
TurnLeft::Utils::TLString str3("Exterminate.");
// ...
/* Basically, name() and expect() will use the passed arg.
* in the output in order to
* display output such as the following:
* str(): expecting 'Exterminate.' | Actual 'Exterminate.' => PASS
*/
strtest.name("str()").expect("Exterminate.").test( str3.str() );
/* To try and determine where the corruption was occuring, I did a
* simple cout here, and got what should be the expected result of
* the next test,
* meaning that the actual test should be succeeding.
*/
std::cout << str3.c_str() << std::endl //outputs Exterminate. normally.
/* But when I try to invoke that same method (c_str()) within the test
* object, it simply copies the argument passed in for name().
*/
chtest.name("c_str()").expect("Exterminate.").test( str3.c_str() );
// Should output 'Exterminate.' as in the saatement before, but instead
// outputs 'c_str()'.
Вот код класса Test:
namespace unittest{
static std::string status[2] = {"FAIL", "PASS"};
template <class ExpectedResult>
class Test
{
private:
ExpectedResult expected;
ExpectedResult actual;
std::string testName;
public:
Test();
Test <ExpectedResult>& expect (ExpectedResult value);
Test <ExpectedResult>& name (std::string);
void test (ExpectedResult value);
};
template <class ExpectedResult> Test <ExpectedResult>&
Test<ExpectedResult>::expect(ExpectedResult value)
{
expected = value;
return *this;
}
template <class ExpectedResult>
Test <ExpectedResult>&
Test<ExpectedResult>::name(std::string aName)
{
testName = aName;
return *this;
}
template <class ExpectedResult>
void Test<ExpectedResult>::test(ExpectedResult value)
{
actual = value;
std::cout << testName << ": ";
std::cout << "Expecting: " << expected << " | ";
std::cout << "Actual: " << actual;
std::cout << " => " << status[actual==expected] << std::endl;
}
Я пишу класс TLString, который обеспечит более плавную работу со строками в C++ (например, конкатенацию). Он использует строковый поток для обработки этих операций. Метод TLStream::c_str()
на самом деле просто делает это: return stream.str().c_str();
Итак, я действительно смущен тем, как actual
присваивается значение testName
. Я не уверен, где возникает конфликт, учитывая, что единственный раз, когда переменные to приближаются к взаимодействию, - это когда они оба выводятся в CLI, и даже более того, поскольку в этом случае эти два являются разными типами данных.
Я написал функциональность c_str(), потому что, проще говоря, никогда не знаешь, когда какая-то сторонняя библиотека будет полагаться на строки C вместо строк C++, и не видел причин ограничивать мой класс. Даже в std::ios вам нужно использовать строки c для некоторых вещей.
Любая помощь будет принята с благодарностью.
Спасибо!
append
илиoperator+/operator+=
для конкатенации? - person chris   schedule 17.05.2012