Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не видит определенной структуры


Автор: CyberDemon 23.8.2008, 16:42
Модераторы, заранее прошу не переносить в другой раздел, т.к. хоть и используется 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 64

typedef 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 dialog
class CMakeMess;
class SerialGate;
class CSystemTray;
//class CNewGroup;
class CSendSMSDlg : public CDialog
{
    friend class CDataBase;
// Construction
public:
    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 dialog

class 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 specifiers
AbonentDlg.h(28): error C2146: syntax error : missing ';' before identifier 'ab'


И так везде, где в классе CAbonentDlg пытаешься объявить структуру. Наверняка какая-нить мелкая кракозябра, но ни как не могу найти....

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

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

Автор: mes 23.8.2008, 17:44
Цитата(CyberDemon @  23.8.2008,  16:42 Найти цитируемый пост)
И так везде, где в классе CAbonentDlg пытаешься объявить структуру. Наверняка какая-нить мелкая кракозябра, но ни как не могу найти.... 


в исходнике наблюдается взаимное включение хидеров, т.е в sendsmsdlg.h -  #include "abonentdlg.h", а в abonentdlg.h - #include "sendsmsdlg.h"

Автор: CyberDemon 23.8.2008, 18:15
Цитата(mes @ 23.8.2008,  17:44)
в исходнике наблюдается взаимное включение хидеров, т.е в sendsmsdlg.h -  #include "abonentdlg.h", а в abonentdlg.h - #include "sendsmsdlg.h"

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

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

Автор: CyberDemon 23.8.2008, 19:31
Спасибо за идею. Все заработало. Переделал так:

defines.h
Код

//Здесь определяются структуры, используемые в программе
#pragma once

#define WM_FROM_TRAY 0x1000
#define MAX_NAME 260
#define MAX_ABONENT_NAME 64

typedef 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 dialog
class CMakeMess;
class SerialGate;
class CSystemTray;
//class CNewGroup;
class CSendSMSDlg : public CDialog
{
    friend class CDataBase;
// Construction
public:
    CSendSMSDlg(CWnd* pParent = NULL);    // standard constructor
    virtual ~CSendSMSDlg();
// Dialog Data
    enum { IDD = IDD_SENDSMS_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    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 dialog

class 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;
};


Но все же вопрос остался. Почему такое было?
И еще, я уже давно не программил, только недавно сел и стал впоминать. Может кто-нить сможет навести позитивную критику по коду, который я вверху привел?

Автор: mes 23.8.2008, 20:23
Цитата(CyberDemon @  23.8.2008,  19:31 Найти цитируемый пост)
Но все же вопрос остался. Почему такое было?

почитайте на тему  forward declaration и с чем ее едят в Cpp. )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)