【问题标题】:Help about class and error: C3861关于类和错误的帮助:C3861
【发布时间】:2010-05-16 13:28:44
【问题描述】:

有人可以帮我解决这个错误吗?

在“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
...

提前致谢!

【问题讨论】:

    标签: c++ visual-studio-2005


    【解决方案1】:

    这就是我曾经对那些必须从 Java 学习 C++ 并且总是对何时使用 ::.-> 感到困惑的学生提出的问题:

    • A::B 表示 A 是类或命名空间名称。
    • A.B 表示 A 要么是对象,要么是对对象的引用。
    • A->B 表示 A 是指针或具有 operator-> 重载的类型的对象(也称为“智能指针”)

    如果你知道这些,你也可以将它们倒过来应用,这样如果你有一个A 和一个B,你就知道在它们之间放什么。

    (我认为这些规则必须针对 C++11 进行扩展,但我不确定。如果您知道,请随时添加。)

    【讨论】:

      【解决方案2】:

      您可以使用范围运算符 :: 而不是成员访问运算符 . 来访问静态变量

      例子:

      cDef::MESSAGE_ENTER

      您还应该将 cpp 文件中 cDef 的成员初始化为某个值。在这种情况下,枚举可能会更好。

      【讨论】:

        【解决方案3】:

        这似乎是显而易见的——你声明了成员函数

        virtual void MessengeEnter(int message) = 0;
        

        但打电话

        MessageEnter(message);
        

        (注意MessengeMessage之间的区别)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多