Я написал программу сегодня, которая давала мне настоящую головную боль, когда она не срабатывала, как я ожидал этого.C++ 14 Вызов конструктора [с разными аргументами] из другого конструктора (тот же класс)
Итак, я написал короткий пример, который (почти) * воспроизводит проблему.
Надеюсь, это справедливо объяснимо в том, что он должен делать.
#include <iostream>
class A
{
public:
enum class defaults
{
DEFAULT_A
};
A(defaults default_val)
{
if(default_val == defaults::DEFAULT_A)
{
A("hello world");
}
}
A(std::string str_)
{
str = str_;
flag = true;
}
std::string getStr()
{
return str;
}
bool getFlag()
{
return flag;
}
private:
bool flag;
std::string str;
};
int main()
{
A a(A::defaults::DEFAULT_A);
std::cout << a.getStr() << std::endl;
std::cout << a.getStr().size() << std::endl;
if(a.getFlag())
{
std::cout << "true" << std::endl;
}
else
{
std::cout << "false" << std::endl;
}
}
Компиляция и запуск кода: g++ --std=c++14 main.cpp && ./a.out
Компиляция на/с GCC версии 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2)
Выход: [с номерами строк]
1:
2: 0
3: true
(это первая строка пустая строка.)
* Единственная вещь, которая отличный от этого примера и кода, над которым я работал сегодня, является то, что флаг в коде, который я написал ранее, был false
не true
, но это все еще НЕ то, что я ожидал от него - я ожидал, что это будет true
. А также строка не была пустой, но она содержала «бессмысленные значения» - по крайней мере, не то, что я ожидал от нее.
Что я здесь сделал неправильно? Думаю, это действительно очевидно, но я просто не могу это понять. (Возможно, я работаю над той же проблемой для слишком долго?)
Edit:
Могу ли я сделать это, чтобы исправить эту проблему?
A(defaults default_val)
{
if(default_val == defaults::DEFAULT_A)
{
*this = A("hello world");
}
}
конечно - damnit – user3728501
Как я могу сделать то, что я пытаюсь сделать? – user3728501
Кроме того, 'a.getFlag()' вызывает неопределенное поведение, потому что 'flag' не был инициализирован –