С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196

Не видит реализации

07.08.2019, 23:46. Показов 2638. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "../EvoLibs.h"
 
namespace EvoEngine
{
    namespace Game
    {       
        class GameObject
        {
        public:
            virtual bool Create() = 0;
            virtual void Draw() = 0;
            virtual void Update() = 0;
 
        protected:
            //physicsBody
            Controller controller;
            OpenGL::Shader view;
        };
    }
}


При компиляции выводит такую ошибку:
1>EvoController.cpp
1>evogameobject\evogameobject.h(21): error C3646: controller: неизвестный спецификатор переопределения
1>evogameobject\evogameobject.h(21): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>EvoShader.cpp
1>g:\evolibs\evogameobject\evogameobject .h(22): error C2039: Shader: не является членом "EvoEngine::OpenGL"
1>g:\evolibs\evoopenglptr\evoopenglptr.h (27): note: см. объявление "EvoEngine::OpenGL"
1>g:\evolibs\evogameobject\evogameobject .h(22): error C3646: view: неизвестный спецификатор переопределения
1>g:\evolibs\evogameobject\evogameobject .h(22): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию

При этом в другом файле есть и объявление и реализация:
Кликните здесь для просмотра всего текста
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
Controller.h
#include "../EvoLibs.h"
namespace EvoEngine
{
    class Controller // or Callback? if Callback, i can create new class with only func
    {
        struct Rule
        {
            unsigned char key;
            FuncPtr ptr;
        };
 
        std::vector<Rule> rules;
    public:
        //void AddRule(Input::Keyboard, FuncPtr);
        void AddRule(unsigned char, FuncPtr);
        void Update();
    };
}
Cotroller.cpp
namespace EvoEngine
{
    
    void Controller::AddRule(unsigned char key, FuncPtr ptr)
    {
        ..
    }
    
    void Controller::Update()
    {
        ..
    }
}

Тоже самое происходит с Shader
Все подключения идут через один файл
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "EvoLogger/EvoLogger.h"
#include "EvoFuncPtr/EvoFuncPtr.h"
#ifdef EVO_FUNCPTR
#include "EvoController/EvoController.h"
#endif
//#include "EvoTypename/EvoTypename.h"
#include "EvoOpenGLPtr/EvoOpenGLPtr.h"
#include "EvoApp/EvoApp.h"
//#include "EvoVector/EvoVector.h"
#ifdef EVO_OPENGLPTR
#include "EvoShader/EvoShader.h"
#endif // EVO_OPENGLPTR
#ifdef EVO_SHADER
#ifdef EVO_CONTROLLER
#include "EvoGameObject/EvoGameObject.h"
#endif
#endif
#ifdef EVO_GAMEOBJECT
#include "EvoGameScene/EvoGameScene.h"
#endif
//#include "EvoMatrix/EvoMatrix.h"

Я не понимаю, почему он не видит реализации.
Я уже пытался прописать полное имя класса(с namespace), добавить везде конструкторы, напрямую подключать хедеры
Ничего из этого не помогло. Если предложите вариант решения, буду благодарен
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.08.2019, 23:46
Ответы с готовыми решениями:

Отделение интерфейса от реализации класса: компиляция кода реализации
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса. Допустим, у меня есть три файла: 1....

WD3200AAJB-00J3A0 то НЕ видит, то видит BIOS, USB-to-IDE/SATA видит всегда
День добрый. Есть HDD WD3200AAJB-00J3A0. Проблема в том, что его перестал видеть BIOS. Иногда на холодную видит и до выключения...

BIOS видит HDD. Windows, Acronis не видит. Live UBUNTU видит
Нужно вытащить данные с неисправного жесткого диска. HDD 2.5&quot; Toshiba 160 Gb Sata. BIOS видит HDD. Windows, Acronis, live CD не видит....

11
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.08.2019, 23:59
Цитата Сообщение от Diochrome Посмотреть сообщение
error C3646: controller: неизвестный спецификатор переопределения
Компилятор не может знать, что такое Controller до его объявления.
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 00:06  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Компилятор не может знать, что такое Controller до его объявления.
Ну так он же знает
Сначала подключается Controller.h
Там он находит объявление и определение
Дальше он находит Shader.h и делает тоже самое
После он доходит до GameObject.h и УПС!
Если вы предлагаете через class Controller; всё решить, то пробовал
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.08.2019, 00:44
Diochrome, не, не знает..
Где ж подключает? У вас файл с классом называется Controller.h в списке подключений я его не вижу..
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 00:52  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Где ж подключает? У вас файл с классом называется Controller.h в списке подключений я его не вижу..
Это для сокращения кода
Вот полный (EvoLibs.h):
Кликните здесь для просмотра всего текста
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
#pragma once
 
#ifndef EVO_LIBS
#define EVO_LIBS
#endif // !EVO_LIBS
 
#define EVO_ENGINE
 
#include "EvoLogger/EvoLogger.h"
#include "EvoFuncPtr/EvoFuncPtr.h"
#ifdef EVO_FUNCPTR
#include "EvoController/EvoController.h"
#endif
//#include "EvoTypename/EvoTypename.h"
#include "EvoOpenGLPtr/EvoOpenGLPtr.h"
#include "EvoApp/EvoApp.h"
//#include "EvoVector/EvoVector.h"
#ifdef EVO_OPENGLPTR
#include "EvoShader/EvoShader.h"
#endif // EVO_OPENGLPTR
#ifdef EVO_SHADER
#ifdef EVO_CONTROLLER
#include "EvoGameObject/EvoGameObject.h"
#endif
#endif
#ifdef EVO_GAMEOBJECT
#include "EvoGameScene/EvoGameScene.h"
#endif
//#include "EvoMatrix/EvoMatrix.h"

EvoController.h
Кликните здесь для просмотра всего текста
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
#pragma once
 
#ifndef EVO_CONTROLLER
#define EVO_CONTROLLER
 
#include <vector>
#include "..\EvoLibs.h"
 
#ifndef EVO_LOGGER
#define RETURN return
#define RETURN_T return
#endif
 
namespace EvoEngine
{
    class Controller // or Callback? if Callback, i can create new class with only func
    {
        struct Rule
        {
            unsigned char key;
            FuncPtr ptr;
        };
 
        std::vector<Rule> rules;
    public:
        //void AddRule(Input::Keyboard, FuncPtr);
        void AddRule(unsigned char, FuncPtr);
        void Update();
    };
}
#endif // !EVO_CONTROLLER

Шейдер подключается также

Добавлено через 1 минуту
Сам контроллер отдельно работает, ошибка появляется только при подключении нового хедера
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
08.08.2019, 00:54
Лучший ответ Сообщение было отмечено Diochrome как решение

Решение

А EvoController.h у вас имеет header guards? Кажется причина в них.
Вы в каждом заголовочном файле пытаетесь подключить один и тот же список заголовков.
В EvoController.h вы подключаете EvoGameObject.h, создаётся защитник для EvoGameObject.h
А потом в EvoGameObject.h подключаете EvoController.h, который снова подключает EvoGameObject.h - вот отсюда и появляется эта ошибка, так как подключенный второй раз EvoGameObject.h уже не увидит класс Controller.

Короче у вас неправильная архитектура подключения заголовков. Избавляться от гуардов нельзя ни в коем случае, нужно пересмотреть порядок подключения.
1
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 00:58  [ТС]
Но разве конструкция
C++
1
2
3
4
5
#pragma once
#ifndef Controller
#define Controller
// объявления
#endif
от этого не спасает? Я уверен, что если я подключу только нужные инклуды, то все решится, но проблема в том, что этот проект подразумевается как собрание библиотек, чтобы можно было отключить ненужное и чтобы ничего не поломалось.

А, кажется я понял о чем вы.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
08.08.2019, 01:12
Цитата Сообщение от Diochrome Посмотреть сообщение
Я уверен, что если я подключу только нужные инклуды, то все решится
Не решится, как только вы в EvoController.h заинклудите EvoGameObject.h, а в EvoGameObject.h - EvoController.h, а потом в другом заголовочнике/исходнике заинклудите оба этих файла, у вас снова появится эта же ошибка.

Старайтесь подключать заголовочные файлы только в исходниках. Если собака не должна знать о кошке, то не нужно садить их в одну комнату.

Максимально используйте предопределённые классы.

C++
1
2
3
        protected:
            //physicsBody
            Controller controller;
Вот тут сразу возникает вопрос, почему controller у вас не является указателем. Если бы вы сделали его указателем, то предопределенный класс Controller позволил бы вообще не подключать EvoController.h в этом файле.
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 01:27  [ТС]
Цитата Сообщение от WxMaper Посмотреть сообщение
Вот тут сразу возникает вопрос, почему controller у вас не является указателем. Если бы вы сделали его указателем, то предопределенный класс Controller позволил бы вообще не подключать EvoController.h в этом файле.
Видимо, не хватает опыта. Об этом я не знал.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.08.2019, 11:29
Цитата Сообщение от Diochrome Посмотреть сообщение
Вот полный (EvoLibs.h):
Ох, это кто ж вас таки на это надоумил?
Смотрим код:
Заходит компилятор такой в ваш EvoLibs.h файл и читает его строка за строкой, и доходит до места
C++
1
2
3
#ifdef EVO_FUNCPTR // и смотрит, а не была ли выше, где-то определена константа EVO_FUNCPTR?
#include "EvoController/EvoController.h"
#endif
А давайте посмотрим:
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
#ifndef EVO_LIBS
#define EVO_LIBS // Или это? Тоже нет.
#endif // !EVO_LIBS
 
#define EVO_ENGINE // может это? Да, нет.
 
#include "EvoLogger/EvoLogger.h"
#include "EvoFuncPtr/EvoFuncPtr.h"
Уфф.. Не нашли, ну, тогда просто игнорим подключение
C++
1
#include "EvoController/EvoController.h"
, для того, чтобы компилятор не игнорил надо сделать #define EVO_FUNCPTR выше, до проверки #ifdef. А вы еще спорите, что компилятор все подключает.

Вообще это дичь какая-то, это вы хотели попытку сделать на предкомпилируемые заголовки или что? Что это за костыль?
Лучше уж тогда предкомпилируемые заголовки.

Цитата Сообщение от WxMaper Посмотреть сообщение
Вот тут сразу возникает вопрос, почему controller у вас не является указателем. Если бы вы сделали его указателем, то предопределенный класс Controller позволил бы вообще не подключать EvoController.h в этом файле.
Это как в том анекдоте, сначала говнокодят, а потом пытаются сделать вид, что так должно быть, вместо того, чтобы раз, но нормально сделать..
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
08.08.2019, 11:39
Цитата Сообщение от Azazel-San Посмотреть сообщение
Уфф.. Не нашли, ну, тогда просто игнорим подключение
Полагаю, что EVO_FUNCPTR у него дефайнится в EvoFuncPtr/EvoFuncPtr.h (а может и нет), но даже если так, то всё равно реализация не ахти.
Для чего все эти #ifdef не особо понятно, если всё и так подключается последовательно, насколько это можно увидеть из кода.
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
08.08.2019, 16:38  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Уфф.. Не нашли, ну, тогда просто игнорим подключение
Интересное умозаключение. Жаль, что глупое. Парень снизу все расписал

Цитата Сообщение от WxMaper Посмотреть сообщение
Для чего все эти #ifdef не особо понятно, если всё и так подключается последовательно
Предполагалось, что это будет что-то вроде сборника библиотек, часть из которых можно было бы отключать. То есть закоментил определённую строчку и снизу сразу бы отключились зависимые библиотеки. Короче, делано было это ради удобства. Насчет проблемы - она решена правильными инклудами, спасибо.

Добавлено через 3 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
сначала говнокодят,
А чем это говнокод? Ну не сделал я его указателем, нифига от этого не поменяется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2019, 16:38
Помогаю со студенческими работами здесь

HDD-видит BIOS, видит диспетчер устройст, но не видит система
Ну что же, вечер добрый товарищи. Возникла такая проблема, описываю все по-порядку. -Купил винт(террабайт, внутренний). Так как на...

Антевирусник Касперский не видит вирусы, а доктор веб видит их, но не может удалить
Включаю полную проверку компьютера на вирусы при помощи антивирусника Каспирским. В результате проверки выясняется, что часть вирусов...

Форма передает данные, скрипт видит переменные, но не видит их значение
Доброго времени суток всем! У меня проблема, если не трудно- помогите plz! Форма передает данные, скрипт видит переменные, но не видит их...

Ноут видит жесткий в system info но не видит в boot priority
всем привет. ноут самсунг np355v5c-s0mru решил переустановить винду с 8 на 7. не мог загрузиться с флешки потому что при отключении secure...

Хром 56.0.2924.87 не видит табл.стилей а Лиса 4.0 Видит, почему?
Хром 56.0.2924.87 не видит табл.стилей а Лиса 4.0 Видит, почему? И как сделать, чтобы Хром видел? HTML &lt;!DOCTYPE HTML PUBLIC...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru