C++ constructor delegation

94
23 января 2021, 04:30

Можно ли в конструкторе, два раза вызвать другой конструктор?

class Constructor
{
public:
Constructor()
{
    printf("Default constructor\n");
}
explicit Constructor(int _a) : Constructor("explicit")
{
    printf("Integer constructor\n");
    this->a = _a;
}
Constructor(std::string _str) : str(_str)
{
    printf("string constructor\n");
    Constructor(true);
    Constructor(1, 2);
}
Constructor(bool _flag) : flag(_flag) 
{
    printf("Bool constructor");
}
Constructor(int a, int b)
{
    printf("one more");
}
void Print()
{
    printf("a = %d\n", a);
    printf("flag = %d\n", flag);
}
private:
    int a;
    std::string str;
    bool flag = false;
};
int main()
{
    Constructor cons(1);
    cons.Print();
   return 0;
}

Ожидаю увидеть в консоли:

string constructor
Bool constructor
one more
Integer constructor a = 1 flag = 1

А вместо этого:

Bool constructor Integer contstructor a = 1 flag = 1

Answer 1
Constructor("explicit")

Implicit conversion turns string literal into bool: const char[9] to 'bool'

Constructor(std:string("explicit")) //так выполняется как вы ожидали

Конструкторы вызывать можно, если в контексте этого же объекта хотите создавать другие(!) объекты этого же типа класса, что и происходит в Constructor(true); Constructor(1, 2);, где они сразу же удаляются при завершении работы конструктора.

Answer 2
  • Вызвать несколько конструкторов класса из одного конструктора этого класса можно только через многоуровневую делегацию конструкторов.

  • Выбор конструктора при делегации делается по обычным правилам разрешения перегрузки (overload resolution). По этим правилам преобразование аргумента "explicit" к типу bool является более предпочтительным, чем к типу std::string. Потому и вызывается конструктор с параметром типа bool

    void foo(bool) {}
    void foo(std::string) {}
    int main()
    {
      foo("Hello World"); // вызывается `foo(bool)`.
    }
    
READ ALSO
Как в stl контейнерах (например std::list) получить и удалить элемент из контейнера за один вызов функции?

Как в stl контейнерах (например std::list) получить и удалить элемент из контейнера за один вызов функции?

Есть ли какая-то возможность забрать элемент из std::list одновременно удаляя его (не вызывая отдельно два метода front и pop_front)? Если такого метода...

111
expected unqualified-id before '->' token

expected unqualified-id before '->' token

cpp- ругается на цикл где if: expected unqualified-id before '->' token, не нравится Sprite

114
Rails 6 не подключается bootstrap 4 и jQuery

Rails 6 не подключается bootstrap 4 и jQuery

Выдает после установки bootstrap 4 и jQuery в панели разработчика ошибки

156
В чем разница между div и span

В чем разница между div и span

Я новичок в программировании и хотелось бы досконально разобраться в чем разница между div и spanСтоит ли использовать только div или только span или...

132