два конструктора по умолчанию, один общедоступный и один частный

Мой вопрос касается конструкторов в ООП (С++). Когда я определяю конструктор по умолчанию в классе как частный и когда я инициализирую объект этого класса в основном по умолчанию, возникает ошибка, что конструктор по умолчанию недоступен. Все хорошо. Но затем я также создаю конструктор аргументов по умолчанию в разделе Public, и когда я снова инициализирую объект в main, возникает неоднозначный вызов перегрузки функции. Итак, мой вопрос заключается в том, что если частный конструктор недоступен из основного, то компилятор должен вызывать конструктор в общедоступном разделе, который является конструктором аргументов по умолчанию. Пожалуйста, ответьте, почему это происходит.


person Islamic Palace    schedule 24.09.2020    source источник
comment
Пожалуйста, предоставьте фрагмент кода   -  person Mansoor    schedule 24.09.2020


Ответы (2)


Например, возьмите класс

#include "iostream"

class Type
{
  private:
    Type()
    {
        std::cout<<"Private Default";
    }
  public:
    Type()
    {
        std::cout<<"Public Default";   
    }
};

int main()
{
    Type obj;
}

Здесь оба конструктора по умолчанию находятся в области Type::Type(). Вы не можете перегружаться таким образом, т. е. нет частной области или общедоступной области, все они находятся в области Type. Таким образом, вы не можете перегрузить это в соответствии с правилами перегрузки С++.

Вывод для приведенного выше кода:

main.cpp:11:5: error: ‘Type::Type()’ cannot be overloaded
     Type()
     ^~~~
main.cpp:6:5: error: with ‘Type::Type()’
     Type()
     ^~~~
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Type::Type()’ is private within this context
     Type obj;
          ^~~
main.cpp:6:5: note: declared private here
     Type()
     ^~~~

И если вам удобно c++11, вы можете удалить конструктор, например

class Type
{
  public:
    Type() = delete;
};
person srilakshmikanthanp    schedule 24.09.2020

Разрешено ли какой-либо области вашей программы обращаться к функциям и/или создавать экземпляры типов классов, решается компилятором после разрешения перегрузки. Это означает, что доступные конструкторы не фильтруются по их private или public видимости.

В вашем сценарии это может не иметь непосредственного смысла при просмотре функции main, из которой вы, кажется, создаете экземпляры объектов рассматриваемого класса. Но представьте, что вы создаете экземпляр класса from с функцией-членом этого класса: здесь видны оба члена private и public, и компилятор не сможет решить, какой из них он должен взять.

В качестве примечания: если вы не хотите, чтобы ваш класс создавался ctor по умолчанию, предпочитайте его = delete. Кроме того, конструктор по умолчанию и конструктор с одним аргументом по умолчанию, безусловно, могут быть реорганизованы в два конструктора, например. используя инициализаторы в классе.

person lubgr    schedule 24.09.2020