Странное поведение в конструкторе

У меня есть класс, состоящий из нескольких полей, и у меня есть несколько конструкторов. У меня также есть конструктор, который не принимает никаких параметров, но когда я пытаюсь его использовать:

int main {
    A a;
}

Компилятор выдает ошибку, а если я использую его так:

int main {
    A a();
}

Ничего страшного. Это что?

Спасибо


person tunnuz    schedule 03.02.2009    source источник


Ответы (4)


Первый main использует конструктор A по умолчанию. Второй объявляет функцию, которая не принимает параметров и возвращает A по значению, что, вероятно, не соответствует вашим намерениям.

Так как же выглядит определение A и какую ошибку генерирует компилятор?

О, и вам нужно предоставить список параметров в объявлении main: int main() { //... , а не int main { //...

person CB Bailey    schedule 03.02.2009

Под OK вы подразумеваете, что он компилируется или работает? Строка кода:

   A a();

— это объявление (или прототип) функции с именем a, которая не принимает параметров и возвращает объект типа A.

Я думаю, что для того, чтобы кто-то мог помочь вам с вашей реальной проблемой, вам нужно опубликовать хотя бы декларацию для class A.

person Michael Burr    schedule 03.02.2009

Чарльз и Майкл Берр определили, что второе объявление на самом деле было прототипом функции, а не воплощением A.

Что касается возможных причин, по которым ваш первый фрагмент кода не работал, вы получите ошибку компиляции в этой ситуации, когда:

  1. Класс A наследуется от базового класса, у которого нет конструктора по умолчанию; ИЛИ ЖЕ
  2. Класс A содержит объекты типов, не имеющих конструктора по умолчанию; ИЛИ ЖЕ
  3. Класс A содержит ссылочные члены;

А ТАКЖЕ

Вы предоставили конструктор по умолчанию, который пропускает один или несколько из этих подобъектов из своего списка инициализаторов.

Все эти подобъекты нуждаются в некотором способе инициализации, а конструктор по умолчанию, созданный компилятором, этого не сделает. Обратите внимание, что во всех случаях вам нужно инициализировать их в списке инициализаторов, а не в теле конструктора.

person j_random_hacker    schedule 03.02.2009

Вы оба правы, у меня возникла проблема внутри класса.

person tunnuz    schedule 03.02.2009