Справка о классе и ошибки: C3861 - PullRequest
0 голосов
/ 16 мая 2010

Может кто-нибудь помочь мне в этой ошибке?

в "cDef.h":

#pragma once

class cDef 
{
public:

    static int STATE_LOGO;
    static int STATE_MENU;

    static int MESSAGE_ENTER;
    static int MESSAGE_UPDATE;
    static int MESSAGE_PAINT;
    static int MESSAGE_EXIT;
};

в "GameState.h":

#pragma once
#ifndef _GameState_
#define _GameState_
#include "cDef.h"

class MainGame;
class GameState;


class GameState
{
public:

    MainGame *mg;
    int GAME_STATE_DEF;

    virtual void MessengeEnter(int message) = 0;
    virtual void MessengeUpdate(int message,int keys) = 0;
    virtual void MessengePaint(int message,CDC *pDc) = 0;

void StateHandler(int message,CDC *pDc,int keys);

public:
    GameState(void);
public:
    ~GameState(void);
};
#endif

в "GameState.cpp":

#include "StdAfx.h"
#include "GameState.h"

GameState::GameState(void)
{
    GAME_STATE_DEF = -1;
}

GameState::~GameState(void)
{
}

void GameState::StateHandler(int message,CDC *pDc,int keys)
{
    if(message == cDef.MESSAGE_ENTER)
    {
        MessageEnter(message);
    }

    if(message == cDef.MESSAGE_UPDATE)
    {
        MessageUpdate(message,keys);
    }

    if(message == cDef.MESSAGE_PAINT)
    {
        MessagePaint(message,pDC);
    }
}

ошибка:

warning C4832: token '.' is illegal after UDT 'cDef'
see declaration of 'cDef'
error C3861: 'MessageUpdate': identifier not found
error C3861: 'MessageEnter': identifier not found
error C3861: 'MessagePaint': identifier not found
...

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 16 мая 2010

Вот то, что я использовал, чтобы вбивать своих учеников, которые должны были изучать C ++ из Java и всегда были озадачены тем, когда использовать ::, . и ->:

  • A::B означает, что A - это имя класса или пространства имен.
  • A.B означает, что A является либо объектом, либо ссылкой на объект.
  • A->B означает, что A является либо указателем, либо объектом типа, который перегружен operator-> (например, «умный указатель»)

Если вы знаете это, вы также можете применить их в обратном направлении, так что если у вас есть A и B, вы знаете, что ставить между ними.

(Я думаю, что эти правила придется расширить для C ++ 11, но я не уверен. Если вы знаете, не стесняйтесь добавлять это.)

1 голос
/ 16 мая 2010

Это кажется очевидным, когда вы это видите - вы объявляете функцию-член

virtual void MessengeEnter(int message) = 0;

но звоните

MessageEnter(message);

(обратите внимание на разницу между Messenge и Message)

1 голос
/ 16 мая 2010

Доступ к статическим переменным осуществляется с помощью оператора области действия :: вместо оператора доступа к элементу .

Пример:

cDef::MESSAGE_ENTER

Также вы должны инициализировать элементы cDef в вашем файле cpp некоторым значением. В этом случае, кстати, enum, вероятно, лучше.

...