Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 06.06.2019
Сообщений: 8

Инициализация классов до их описания

27.12.2019, 20:06. Показов 605. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Недавно начал снова работать с ООП в C++, но столкнулся со следующей проблемой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Inventory {
    public:
        void addItemToPlayer(Player p, int id) {
            ...
        }
};
class Player {
    public:
        Inventory inventory;
        Player(Inventory _inventory) {
            inventory = _inventory;
        }
};
При компиляции возникает следующая ошибка: "[Error] 'Player' has not been declared". Так вот, я забыл, как мне инициализировать класс до того, как его описать. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2019, 20:06
Ответы с готовыми решениями:

Описания классов
24. Разработать класс для представления колеса (окружность со спицами). 25. Разработать класс для представления условного изображения...

Создание описания классов
Здраствуйте, у меня такой вопрос (речь об интерфесе самого visual 2008). Скажем при наведении мыши на стандартный класс (пример,класс...

Различия описания классов в DEV и Visual C++
Собственно что хотелось бы спросить скачал DEV среду, а решебник нашел по Visual. Сейчас смотрю построение перегруженного конструктора,...

9
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
27.12.2019, 20:15
BOT_MrLenya,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Player;
 
class Inventory {
public:
    void addItemToPlayer(Player p, int id) {
        ...
    }
};
class Player {
public:
    Inventory inventory;
    Player(Inventory _inventory) {
        inventory = _inventory;
    }
};
что-то вообще странная логика программы!!!!
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,058
27.12.2019, 20:25
Цитата Сообщение от BOT_MrLenya Посмотреть сообщение
инициализировать класс
можно сделать предварительное объявление (как в предыдущем посте), тогда можно будет пользоваться ссылками и указателями на класс. Но пока определения класса не будет, экземпляр класса создать нельзя (в строке 5 будет ошибка)

Добавлено через 4 минуты
выйти из ситуации можно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Player;
 
class Inventory {
public:
    void addItemToPlayer(Player p, int id);
};
class Player {
public:
    Inventory inventory;
    Player(Inventory _inventory) {
        inventory = _inventory;
    }
};
 
void Inventory::addItemToPlayer(Player p, int id)
{
}
0
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
27.12.2019, 20:26
BOT_MrLenya,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Player;
 
class Inventory 
{
public:
     void addItemToPlayer(Player p, int id) 
    {
         this->id = id;
    }
 
 private:
 
     int id;
 
};
class Player 
{
public:
    
};
int main(int argc, char* argv[])
{
    system("chcp 1251 > nul"); 
  
   
    Inventory arr; Player a;
 
    arr.addItemToPlayer(a, 3424);
 
 
    system("pause > nul");
 
    return EXIT_SUCCESS;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
27.12.2019, 20:54
Цитата Сообщение от BOT_MrLenya Посмотреть сообщение
При компиляции возникает следующая ошибка: "[Error] 'Player' has not been declared". Так вот, я забыл, как мне инициализировать класс до того, как его описать.
Никакого отношения к "инициализации" эта тема не имеет, поэтому не ясно, почему вы ведёте речь об инициализации.

Язык не позволит вам сделать определение объекта неизвестного или неполного типа.

Вы можете сделать предварительное объявление класса Player, как показано в ответах выше. Этого, однако, совершенно не достаточно. Неполный класс все равно не разрешается использовать в типах параметров в определении функции. Дополнительно, вам придется перенести определение функции addItemToPlayer вниз, так чтобы оно располагалось после полного определения класса Player

В ответе Алексей1153 показано, как это будет выглядеть в результате. Единственно что для полного сохранения эквивалентности, функция должна быть определена как inline.

Добавлено через 4 минуты
Цитата Сообщение от _-_VLADoS_-_ Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class Player;
 
class Inventory 
{
public:
     void addItemToPlayer(Player p, int id) 
    {
         this->id = id;
    }
Попытка использования неполного типа в списке параметров в определении функции - ошибка.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.12.2019, 22:14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы можете сделать предварительное объявление класса Player, как показано в ответах выше. Этого, однако, совершенно не достаточно.
недостаточно для чего?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
27.12.2019, 22:18
Цитата Сообщение от hoggy Посмотреть сообщение
недостаточно для чего?
У меня там подробно написано в следующем же предложении: недостаточно для того, чтобы использовать такой тип в качестве типа параметра в определении метода. Ответ (неправильный) от _-_VLADoS_-_ как раз демонстрирует эту недостаточность.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.12.2019, 22:33
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У меня там подробно написано в следующем же предложении: недостаточно для того, чтобы использовать такой тип в качестве типа параметра в определении метода.
ты выражаешься как то по китайски.

какой "такой", не полный что ли?

вот я смотрю на ответ от господина Алексей1153, и не пойму: что там тебе совершенно недостаточным показалось?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ответ (неправильный) от _-_VLADoS_-_ как раз демонстрирует эту недостаточность.
это - только один из ответов.

же писал во множественном числе:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
как показано в ответах выше.
я так понял, другие ответы тебе так же показались совершенно недостаточными.

или ты увидел один неправильный ответ,
и решил обобщить сразу на все ответы?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
27.12.2019, 22:40
Цитата Сообщение от hoggy Посмотреть сообщение
какой "такой", не полный что ли?
Совершенно верно. "Предварительно объявленный", т.е. неполный.

Цитата Сообщение от hoggy Посмотреть сообщение
вот я смотрю на ответ от господина Алексей1153, и не пойму: что там тебе совершенно недостаточным показалось?
Я же ясно написал, что в ответе Алексей1153 все сделано правильно (кроме мелкого замечания про inline). Вам нужно научиться читать мои ответы целиком, прежде чем бросаться на них отвечать: то, что вам непонятно в моем ответе сначала, скорее всего станет понятно дальше.

Цитата Сообщение от hoggy Посмотреть сообщение
я так понял, другие ответы тебе так же показались совершенно недостаточными.
Какие еще "ответы показались совершенно недостаточными"? Я же ясно написал: предварительного объявления класса недостаточно. Ни о каких "недостаточных ответах" речи нигде не шло.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.12.2019, 22:46
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я же ясно написал: предварительного объявления класса недостаточно. Ни о каких "недостаточных ответах" речи нигде не шло.
всё, дошло наконец.
спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.12.2019, 22:46
Помогаю со студенческими работами здесь

Описания членов - данных пользовательских классов
Помогите пожалуйста ЖИВОТНОЕ имя – char* класс – char* средний вес – int 2.Постановка задачи. Следует дать конкретную...

Описания членов - данных пользовательских классов
⦁ Определить пользовательский класс в соответствии с вариантом задания (смотри приложение). ⦁ Определить в классе следующие...

Атрибуты для описания классов и методов
Подскажите какие атрибуты нужно дописывать классам и методам, чтобы при наведении на них появлялось подобное тестовое их описание, как...

Построить систему классов для описания штата сотрудников
Задание 2: Построить систему классов для описания штата сотрудников: администраторы, инженеры, рабочие, стажеры. Предусмотреть методы...

КЛАССЫ И ОБЪЕКТЫ В С++. Описания членов - данных пользовательских классов
Помогите пожалуйста, совсем не понимаю как это делать. КЛАССЫ И ОБЪЕКТЫ В С++ Порядок выполнения работы 1. Определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru