Странное поведение в конструкторе - PullRequest
2 голосов
/ 03 февраля 2009

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

int main {
    A a;
}

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

int main {
    A a();
}

Все в порядке. Что это?

Спасибо

Ответы [ 4 ]

11 голосов
/ 03 февраля 2009

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

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

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

2 голосов
/ 03 февраля 2009

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

   A a();

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

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

1 голос
/ 03 февраля 2009

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

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

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

И

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

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

0 голосов
/ 03 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...