Не видит определенной структуры

Модераторы, заранее прошу не переносить в другой раздел, т.к. хоть и используется MFC, речь не про него.Значит есть два класса. CSendSMSDlg:
#pragma once#include <assert.h>#include "resource.h"#include "SerialGate.h"#include "MakeMess.h"#include "afxcmn.h"#include "bcmenu.h"#include "systemtray.h"#include "newgroup.h"#include "database.h"#include "errorcode.h"#include "abonentdlg.h"#include <vector>#define WM_FROM_TRAY 0x1000#define MAX_NAME 260#define MAX_ABONENT_NAME 64typedef struct sDATE{    UINT iDay;    UINT iMon;    UINT iYear;} _sDATE;typedef struct ABONENT{    DWORD dwIndex;    DWORD iGroupId;    DWORD iSubGroupId;    char cFirstName[MAX_ABONENT_NAME];    char cSecondName[MAX_ABONENT_NAME];    char cSurName[MAX_ABONENT_NAME];    char cNomber[12];    char cEMail[MAX_ABONENT_NAME];    sDATE dataBirsday;    BOOL bSendBirsday;    char cComment[MAX_NAME];}_ABONENT;typedef struct GROUPS{    DWORD dwIndex;    long dwSubGroup;    char cName[MAX_NAME];    TVINSERTSTRUCT tvInsert;}_GROUPS;// CSendSMSDlg dialogclass CMakeMess;class SerialGate;class CSystemTray;//class CNewGroup;class CSendSMSDlg : public CDialog{    friend class CDataBase;// Constructionpublic:    CSendSMSDlg(CWnd* pParent = NULL);    // standard constructor    virtual ~CSendSMSDlg();// Dialog Data    enum { IDD = IDD_SENDSMS_DIALOG };    protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support//Далее много ерунды.....
И еще есть CAbonentDlg:
#pragma once#include "sendsmsdlg.h"//#include "resource.h"// CAbonentDlg dialogclass CSendSMSDlg;class CAbonentDlg : public CDialog{    DECLARE_DYNAMIC(CAbonentDlg)public:    CAbonentDlg(CSendSMSDlg* pParent = NULL);   // standard constructor    virtual ~CAbonentDlg();    enum abonent_mode{modeCreate, modeEdit};// Dialog Data    enum { IDD = IDD_ABONENT };protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support    DECLARE_MESSAGE_MAP()public:    virtual INT_PTR DoModal(DWORD State, ABONENT* abonent, DWORD dwCurGroup);private:    ABONENT ab;    bool MakeDataForAddition();    void MakeDataForEdit();public:    void GetData(ABONENT* abonent);private:    COleDateTime pEditDate;    BOOL bCongratulation;    CComboBox conGroup;    CImageList conImage;    CSendSMSDlg* pParent;};
При компиляции вылазит кучу ошибок. Такое чувство, что класс CAbonentDlg не знает про структуру ABONENT.Все ошибки ругаются именно на эту структуру. Вот они:
AbonentDlg.h(26): error C2061: syntax error : identifier 'ABONENT'AbonentDlg.h(28): error C2501: 'CAbonentDlg::ABONENT' : missing storage-class or type specifiersAbonentDlg.h(28): error C2146: syntax error : missing ';' before identifier 'ab'
И так везде, где в классе CAbonentDlg пытаешься объявить структуру. Наверняка какая-нить мелкая кракозябра, но ни как не могу найти....
7 ответов

у тебя слово ABONENT в определении структуры как-то коряво написано - наверное а русскими буквамиCtrl+F даже по этой странице находит только 1 "ABONENT"


Проверил. Прошелся поиском по проекту и по странице. У меня все нашлось. Да и в определении врятли ошибка есть. Еще кучу классов юзают эту структуру и там ошибок нет. На всякий случай инклуду из работающего класса закопипастил в CAbonentDlg и на всякий случай имя структуры тоже. Нет эфекта. :(


И так везде, где в классе CAbonentDlg пытаешься объявить структуру. Наверняка какая-нить мелкая кракозябра, но ни как не могу найти.... 
в исходнике наблюдается взаимное включение хидеров, т.е в sendsmsdlg.h -  #include "abonentdlg.h", а в abonentdlg.h - #include "sendsmsdlg.h"


в исходнике наблюдается взаимное включение хидеров, т.е в sendsmsdlg.h -  #include "abonentdlg.h", а в abonentdlg.h - #include "sendsmsdlg.h"
правильно. А как еще может CAbonentDlg узнать о CSendSMSDlg, и соответственно обо всех структурах, объявленный в этом хедере? Разве что присать отдельный хедер, исключительно для определения, и включать его во все остальные хедеры. Но это очень долго и неморно. А в CSendSMSDlg включен CAbonentDlg потому, что именно от туда и вызывается CAbonentDlg::DoModal().


перенесите строчку #include "sendsmsdlg.h" из abonentdlg.h  в abonentdlg.cpp и тоже самое с реализацией связанной с  CSendSMSDlg..


Спасибо за идею. Все заработало. Переделал так:defines.h
//Здесь определяются структуры, используемые в программе#pragma once#define WM_FROM_TRAY 0x1000#define MAX_NAME 260#define MAX_ABONENT_NAME 64typedef struct sDATE{    UINT iDay;    UINT iMon;    UINT iYear;} _sDATE;typedef struct ABONENT{    DWORD dwIndex;    DWORD iGroupId;    DWORD iSubGroupId;    char cFirstName[MAX_ABONENT_NAME];    char cSecondName[MAX_ABONENT_NAME];    char cSurName[MAX_ABONENT_NAME];    char cNomber[12];    char cEMail[MAX_ABONENT_NAME];    sDATE dataBirsday;    BOOL bSendBirsday;    char cComment[MAX_NAME];}_ABONENT;typedef struct GROUPS{    DWORD dwIndex;    long dwSubGroup;    char cName[MAX_NAME];    TVINSERTSTRUCT tvInsert;}_GROUPS;
SendSMSDlg.h
// SendSMSDlg.h : header file// Хедер основного диалогового окна#pragma once#include <assert.h>#include "resource.h"#include "SerialGate.h"#include "MakeMess.h"#include "afxcmn.h"#include "bcmenu.h"#include "systemtray.h"#include "newgroup.h"#include "database.h"#include "errorcode.h"#include "abonentdlg.h"#include <vector>#include "defines.h" //Фаил определения// CSendSMSDlg dialogclass CMakeMess;class SerialGate;class CSystemTray;//class CNewGroup;class CSendSMSDlg : public CDialog{    friend class CDataBase;// Constructionpublic:    CSendSMSDlg(CWnd* pParent = NULL);    // standard constructor    virtual ~CSendSMSDlg();// Dialog Data    enum { IDD = IDD_SENDSMS_DIALOG };    protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support// Implementationprotected:    HICON m_hIcon;    // Generated message map functions    virtual BOOL OnInitDialog();    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);    afx_msg void OnPaint();    afx_msg HCURSOR OnQueryDragIcon();    DECLARE_MESSAGE_MAP()public:    afx_msg void OnBnClickedSend();    void Message(UINT message);protected:    inline GROUPS* RecreateGroup(DWORD dwSize){if(dwSize==0)return 0;                                                if(dwSizeGroupBase != 0) delete [] group;                                                group = new GROUPS[dwSize];                                                dwSizeGroupBase = dwSize;return group;};    inline ABONENT* RecreateAbonent(DWORD dwSize){if(dwSize==0)return 0;                                                if(dwSizeNomberBase != 0) delete [] abonent;                                                abonent = new ABONENT[dwSize];                                                dwSizeNomberBase = dwSize;return abonent;};    inline DWORD GetGroups(GROUPS* gr){gr = group; return dwSizeGroupBase;};    inline DWORD GetAbonents(ABONENT* ab){ab = abonent; return dwSizeNomberBase;}private:    CSystemTray* m_SysTray;    BOOL TransmitData(HANDLE hCom, char *cData, DWORD DataSize);    SerialGate* pGate;    CMakeMess* pMake;    bool TextWithoutNull(char* cText, char* cOut, DWORD iLen, DWORD iOutSize);    void Error(DWORD dwError);    BOOL DataTransmit(char* cData, char* cNomber);    CString m_strPhoneNomber;    CString m_strTextMessage;    //Shift string to one symbol to left. First symbol will be deleted.    void ShiftNomber(char* cNomber);    CListCtrl m_conList;    CTreeCtrl m_conTree;    CImageList m_conImageForTree;    CImageList m_conImageForList;    void InitObjects();    void InitTree();    void MakeList(NM_TREEVIEW* pNMTreeView = NULL);    GROUPS* group;    ABONENT* abonent;    HTREEITEM* hTree;    BCMenu bcMenu;    afx_msg void OnNMSetfocusTree(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnNMKillfocusTree(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnNMSetfocusElement(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnNMKillfocusElement(NMHDR *pNMHDR, LRESULT *pResult);    DWORD dwSizeNomberBase;    DWORD dwSizeGroupBase;    afx_msg void OnCreateGroup();    afx_msg void OnRemoveGroup();    void DeleteAbonent(DWORD dwIndex);    afx_msg void OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnNMDblclkTree(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult);    CDataBase* pDataBase;    bool bChange, bQuestion;    void AddObjectToTree(DWORD dwIndex);    void AddObjectToList(DWORD dwIndex);    void DeleteObjectFromTree(DWORD dwIndex);    void DeleteObjectFromList(DWORD dwIndex);    void NullGarbage();    afx_msg void OnDestroy();    afx_msg void OnClose();    afx_msg void OnExit();    afx_msg void OnTrayExit();    afx_msg void OnBaseSave();    afx_msg void OnGroupRename();    virtual BOOL PreTranslateMessage(MSG* pMsg);    afx_msg void OnTvnEndlabeleditTree(NMHDR *pNMHDR, LRESULT *pResult);    afx_msg void OnNMDblclkElement(NMHDR *pNMHDR, LRESULT *pResult);    typedef struct OBJLIST{        UINT idElementType;        DWORD iIndexList;        DWORD iIndexData;    }_OBJLIST;    void AddObjectToObjectList(DWORD Type, DWORD iIndexData);    std::vector<OBJLIST> object;public:    afx_msg void OnAddAbonent();};
AbonentDlg.h
//Хедер катрочки абонента#pragma once#include "defines.h"#include "resource.h"// CAbonentDlg dialogclass CSendSMSDlg;class CAbonentDlg : public CDialog{    DECLARE_DYNAMIC(CAbonentDlg)public:    CAbonentDlg(CWnd* pParent = NULL);   // standard constructor    virtual ~CAbonentDlg();    enum abonent_mode{modeCreate, modeEdit};// Dialog Data    enum { IDD = IDD_ABONENT };protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support    DECLARE_MESSAGE_MAP()public:    virtual INT_PTR DoModal(DWORD State, ABONENT* abonent, DWORD dwCurGroup);private:    ABONENT ab;    bool MakeDataForAddition();    void MakeDataForEdit();public:    void GetData(ABONENT* abonent);    void SetData(ABONENT* abonent);private:    COleDateTime pEditDate;    BOOL bCongratulation;    CComboBox conGroup;    CImageList conImage;    CSendSMSDlg* pParent;};
Но все же вопрос остался. Почему такое было?И еще, я уже давно не программил, только недавно сел и стал впоминать. Может кто-нить сможет навести позитивную критику по коду, который я вверху привел?


Но все же вопрос остался. Почему такое было?
почитайте на тему  forward declaration и с чем ее едят в Cpp. )