Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемка с предоглавлением класса  (Прочитано 10775 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dimaslviv
Участник

ua
Offline Offline

« : 08-05-2012 18:08 » 

Доброго времени суток. Пробую огласить сначала прототип класса но чет не проходит
Код: (C++)
class A;
main()
{
  A a;
}
class A
{
  public:
         A(){};
};
Подкажите пожалуйста где я ошибаюсь. Спасибо.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-05-2012 18:23 » 

Вот так пройдет:

Код: (C++)
class A;

void main(void)
{
  A* a;
}

class A
{
  public:
         A(){};
};
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
dimaslviv
Участник

ua
Offline Offline

« Ответ #2 : 08-05-2012 18:32 » 

Dale,
Но такой вариант не выходит

Код: (C++)
class A;
main()
{
  A* a=new A();
}
class A
{
  public:
         A(){};
};

Разве обьявление класса не выступает как прототип..?

Получается что создавать объект можна после определения класса. Может подкажете где можно поточней про это почитать.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 08-05-2012 18:52 » 

Для всех переменных, которые определяются в функциях, выделяется память в стеке. Причем это выделение закладывается заранее, во время компиляции. Компилятор в С/C++ однопроходной. Поэтому не знает сколько надо выделить памяти для опережаюшего определения. Этим он и будет не доволен. Когда ты определяеш указатель на класс. Компилятор знает размер памяти для указателя. Поэтому тут нет проблем.
« Последнее редактирование: 08-05-2012 18:54 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 08-05-2012 19:15 » 

Finch, есть проблема с new A() - про конструктор компилятор всё же ещё не знает. Можно продекларировать указатель, можно ему присвоить значение другого указателя того же типа или NULL, но нельзя разыменовывать указатель (обращаться к членам класса) или выделять новую область памяти под типизированное значение.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 08-05-2012 19:18 » 

Dimka, Это не проблема компилятора Улыбаюсь Он просто помечает, что сушествует такая ссылка на функцию. А уже линковшик собирает ссылки. Тут то как раз нету проблем. Если бы в данном вопросе сушествовала бы проблема. Ни один проект ты бы не смог бы собрать. Так как основная масса всех функций во время компиляции сушествуют только ввиде декларации.
« Последнее редактирование: 08-05-2012 19:21 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
dimaslviv
Участник

ua
Offline Offline

« Ответ #6 : 08-05-2012 19:22 » 

Finch, Спасибо, уже все понятно)

Век живи - век учись... а я только начал
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-05-2012 20:11 » 

Цитата: Finch
Он просто помечает, что сушествует такая ссылка на функцию.
Нельзя сослаться на ещё непродекларированную функцию. Линкер - это уже потом, это из другой оперы.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 08-05-2012 21:50 » new

Dimka, декларирование класса несет в себе также декларирование Конструктора по умолчанию, конструктора копирования и деструктора. Ты волен передекларировать их. Линкер просто отследит этот момент.  Вот если попытаешся использовать другие определения, которые будеш декларировать позже, тогда это вызовет ошибку.
« Последнее редактирование: 08-05-2012 21:54 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines