实例化类的范围/未在此范围内声明

时间:2012-08-06 19:03:55

标签: c++

我是C ++的新人,但我已经学习了一点Java和I / m同时第一次使用SDL,但我的问题是我正在尝试创建一个对象(paddle)p1和p2。

#ifndef PONG_H_
#define PONG_H_
#undef main
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>



class paddle{
private:
    int y;
    int yv;
    int x;
public:

    paddle(){
    y = 0;
    yv = 0;
    x = 0;
    }

    paddle(int ex, int why, int vel){
        y = why;
        yv = vel;
        x = ex;
        }

    void setY(int ycoord) {y = ycoord;}
    void setV(int velocity){ yv = velocity;}
    void setX(int xcoord) {x = xcoord;}
    int getX() {return x;}
    int getY() {return y;}
    int update(){y += yv; return y;}




};


class Pong { //pong class where everythin gets its name and a purpose.

private:

    SDL_Surface * Paddle;
    SDL_Surface * Ball; //SDL_Surface pointer for Ball
    SDL_Surface * screen;   //SDL_Surface  pointer to backbuffer

public:
    int Running;
    Pong(); //eh..

    int OnExecute(); //another function returning a value.
    int w; //width of screen
    int h; //height of screen
    bool OnInit();
    void OnEvent(SDL_Event* Event);
    void OnLoop();
    void OnRender();
    void OnCleanup();


    void redraw( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { //Make a temporary rectangle to hold the offsets
    SDL_Rect offset; //Give the offsets to the rectangle
    offset.x = x; offset.y = y;
    SDL_BlitSurface( source, NULL, destination, &offset );//Blit the surface
    offset.x =0; offset.y=0; //resets the offsets sicne they apaprently dont reset per use.
    };

};


#endif /* PONG_H_ */

是我的头文件,它包含了pong类的主要功能,但是我省略了那些让事情变得不那么令人费解的文件。如果需要这些答案,请告诉我。

我在这里宣布对象......

#include <iostream>
#include <SDL/SDL.h>

#include "Pong.h"
paddle p1;
paddle p2;

Pong::Pong(){
h = 768;
w = 1024;
screen = NULL;
Paddle = NULL;
Ball = NULL;

Running = true;
atexit(SDL_Quit);

}

int Pong::OnExecute() {
    if(OnInit() == false)
        return-1;
    SDL_Event Event;
    while(Running) {
        while(SDL_PollEvent(&Event)) {
            OnEvent(&Event);
        }

        OnLoop();
        OnRender();
    }
    OnCleanup();
return 0;
}

int main( int argc, char* args[]) {
    Pong theApp;
    return theApp.OnExecute();
}

但是什么样的困难是我在...中使用它:

#include "Pong.h"
void Pong::OnEvent(SDL_Event* Event) {
    if(Event->type == SDL_QUIT)
        Running = false;
    switch(Event->type)
    {

        case SDL_KEYDOWN: //look for key holds
            switch(Event->key.keysym.sym) //check key values and changes coords respectiely
            {
            default:
                break;
            case SDLK_UP:
                p2.setV(-2);
                break;

            case SDLK_DOWN:
                p2.setV(2);
                break;

            case SDLK_w:
                p1.setV(-2);
                break;

            case SDLK_s:
                p1.setV(2);
                break;

            case SDLK_ESCAPE:
            Running = false;
                break;
            }
            break;
        case SDL_KEYUP:
            switch(Event->key.keysym.sym)
            {
            default:
                break;
                case SDLK_UP:
                    p2.setV(0);
                    break;

                case SDLK_DOWN:
                    p2.setV(0);
                    break;

                case SDLK_w:
                    p1.setV(0);
                    break;

                case SDLK_s:
                    p1.setV(0);
                    break;
            }
            break;
        break;//break of Key holding event check
    }
}

我很难问这个问题,因为我不知道从哪里开始。我尝试了许多不同的奇怪事物,现在我迷失了。如果您需要更多信息,我很乐意提供。

void Pong::OnLoop(){

    if(p1.getY()<=0){
        p1.setV(0);
        p1.setY(0);
    }
    if(p2.getY()<=0){
        p2.setV(0);
        p2.setY(0);
    }
    if(p1.getY()>=h - Paddle->h){
        p1.setV(0);
            p1.setY(h - Paddle->h);
        }
    if(p2.getY()>=h - Paddle->h){
        p2.setV(0);
            p2.setY(h - Paddle->h);
        }
}

.. \ src \ Pong_OnLoop.cpp:11:5:错误:'p1'未在此范围内声明

.. \ src \ Pong_OnLoop.cpp:15:5:错误:'p2'未在此范围内声明

.. \ src \ Pong_OnLoop.cpp:19:5:错误:'p1'未在此范围内声明

.. \ src \ Pong_OnLoop.cpp:23:5:错误:'p2'未在此范围内声明

2 个答案:

答案 0 :(得分:0)

如果您希望paddles在其定义的文件中可见,则必须向头文件添加声明

extern paddle p1;
extern paddle p2;

所以其他的.cpp文件会知道它们存在。

答案 1 :(得分:0)

由于您没有提供明确的问题,很难提供正确的答案,但我的猜测是您无法在OnEvent- / OnLoop-Method中访问p1和p2。

是否绝对有必要让两个paddle-object存在于全局命名空间中?因为在这种情况下我认为最好有2个paddle-member作为Pong类的一部分,我也会使用这样的初始化列表:

class Pong {
private:

    SDL_Surface * Paddle;
    SDL_Surface * Ball; //SDL_Surface pointer for Ball
    SDL_Surface * screen;   //SDL_Surface  pointer to backbuffer

    paddle p1;
    paddle p2;

public:
    Pong() :
        h(768),
        w(1024),
        screen(NULL),
        Paddle(NULL),
        Ball(NULL),
        Running(true),
        p1(10, 384, 0),
        p2(1014, 384, 0) {
        atexit(SDL_Quit);
    };

    // ...
}; 

您可能根本不需要所有初始化程序,具体取决于优化设置和默认内存初始化,但这不是重点。这样您就可以在所有Pongs自己的方法中访问p1和p2。 Bo Perssons的回答也可以起作用,但我认为这是一个更加客观,因而面向C ++的方法。

旁注:您说头文件包含更多方法 - 看到您的构造函数是在cpp文件中实现的,并且在头文件中有重绘方法,您可能想要了解更多关于内联的内容。在这个例子中,这不是什么大问题,但通常最好将更复杂的方法移到翻译单元(cpp-files),特别是在创建库时。