необъявленный идентификатор в C ++ Visual Studio 2008 - PullRequest
0 голосов
/ 15 октября 2011

У меня есть проект C ++ в Visual Studio 2008.

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

У меня нет проблем с #include Import_LP в любом изформировать классы и создавать объекты и ссылаться на любой из его методов, однако любой другой класс, в который я пытаюсь включить его, дает мне

syntax error : undeclared identifier 'Import_LP'

в строке, на которую он ссылается, т.е. Import_LP ^ importLP;

Я пришел из java / c # фона, есть что-то, чего мне не хватает с этой ссылкой?

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Я смог решить проблему случайным образом.

То есть, очевидно, вы не можете включить два файла друг в друга?

Я делал

#include Window.h

в файле Import_LP.h

и

#include Import_LP.h

в Window.h.

Буду признателен, если кто-нибудь объяснит мне, почему вы не можете этого сделать.

1 голос
/ 17 октября 2011

Если у вас есть защита, она выглядит следующим образом: препроцессор включает Import_LP.h, который говорит «включай меня только один раз», затем включает Window.h, который пытается включить Import_LP.h, но не из-завключить охранник.Поэтому Window.h начинает синтаксический анализ класса окна, но завершается неудачей, поскольку заголовок класса Import_LP.h еще не полностью загружен.

Решение состоит в том, чтобы предварительно объявить классы:

Window.h:

#ifndef WINDOW_H  //works best if this is first
#define WINDOW_H
#pramga once

class Import_LP;
class Window {
    Import_LP* member; //member has to be a pointer
    void func();
};
#include "Import_LP.h"
inline void Window::func() {  
}
#endif WINDOW_H

Import_LP.h:

#ifndef IMPORT_LP_H //works best if this is first
#define IMPORT_LP_H 
#pramga once

class Window;
class Import_LP {
    void func(Window& parent); //parameter has to be a pointer or reference
};
#include "Window.h"
inline void Import_LP::func(Window* parent) {  
}
#endif IMPORT_LP_H 

Это позволит вам ссылаться на другое только посредством указателя или ссылки до фактического включения, но это должно быть выполнимо.Технически это нужно делать только с одним или другим заголовком.

0 голосов
/ 15 октября 2011

Похоже, тип Import_LP не определен, ваша задача выяснить, почему. Первое, что нужно сделать, это прочитать содержимое файла import_LP.h и выяснить, как объявлен Import_LP. Один из возможных подходов - открыть один из хороших файлов, щелкнуть правой кнопкой мыши по использованию Import_LP и выбрать «Перейти к объявлению». Это должно переместить фокус на объявление Import_LP, которое применяется в этом конкретном случае.

Это может быть объявление в окружении #ifdef, что каким-то образом предотвращает его компиляцию в других ваших файлах. Или это может быть что-то еще, нам не хватает деталей для работы.

Обновление:

Так, очевидно, вы не можете иметь два файла, которые включают друг друга? , , , Я был бы признателен, если бы кто-то мог объяснить мне, почему вы не могу этого сделать.

При этом вы можете определить типы и переменные более одного раза.

Существуют такие методы, как #, включая guard и # pragma Once , которые могут использоваться для смягчения подобных проблем.

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