编译器说指针“超出范围”。我做错了什么基本的事情?

时间:2011-04-04 06:13:29

标签: c++ class pointers

好吧,我遇到了一些不一致的情况,这让我朝着我的监狱里的一个拳头大小的洞开车,我宁愿避开。

我正在浏览www.sdltutorials.com上的SDL教程(sdl-tutorial-basics教程,我确信Tim Jones已经完成了一些人)并且遇到了一个错误:'Surf_Display '未在此范围内宣布。

所以,试图弄清楚出了什么问题我把类似的指针代码编写成一个旧的矩形程序,我曾经用C ++类的基础知识刷新自己,用int指针看到了同样的错误,然后尝试隔离问题用更具体的东西。

嗯,更具体的程序编译好而其他程序爆炸所以我猜它是一个非常基本的我缺少,但GISing“C ++指针类”等,什么都不做,我不知道怎么弄更具体。

无论如何......一些代码。

有效的程序......

ct.h

#ifndef _CT_H_
#define _CT_H_

class Classtest2
{
    private:
        int *p_x;
    public:
        Classtest2();
        void set_x(int);
        int get_x();
};

#endif

ct.cpp

#include "ct.h"
#include <cstddef>

Classtest2::Classtest2()
{
    p_x = 0;
}

void Classtest2::set_x(int x)
{
    //do something neat here
}

int Classtest2::get_x()
{
    return *p_x;
}

classtest2.cpp

#include "ct.h"

int main (int argc, char *argv[])
{
    Classtest2 ct2;

    return 0;
}
编译用     g ++ classtest2.cpp ct.h ct.cpp -o bin / classtest2

现在......没有...的程序 经典...

#ifndef _RECTANGLE_H
#define _RECTANGLE_H

namespace shapes
{
    class rectangle
    {
    public:
        int height;
        int width;
        int *weight;

        rectangle (int, int);
        rectangle ();
        int area ();
        void setHeight(int);
        void setWidth(int);
        void setDimensions(int, int);
    };
}
#endif

经典的cpp与重量......

#include "Rectangle.h"
#include <cstddef>

using namespace shapes;

rectangle::rectangle(int h, int w)
{
    height = h;
    width = w;
    weight = NULL;
}

rectangle::rectangle()
{
    height = 0;
    width = 0;
    weight = NULL;
}

int rectangle::area ()
{
    return height * width;
}

void rectangle::setHeight(int h)
{
    height = h;
}

void rectangle::setWidth(int w)
{
    width = w;
}

void rectangle::setDimensions(int h, int w)
{
    height = h;
    width = w;
}

经典的“做一些简单的事”主要......

#include "Rectangle.h"
#include <iostream>

using namespace std;
using namespace shapes;

int main(int argc, char* argv[])
{
    rectangle tr(5,8);

    cout << tr.height << endl;
    cout << tr.width << endl;

    return 0;
}

第一个程序编译得很好,但当然它实际上并没有做任何事情,所以这并不太令人惊讶。第二个(矩形程序也没有实际做任何事情)不编译。我得到以下内容......

g ++ classtest1.cpp Rectangle.h Rectangle.cpp -o bin / classtest1

Rectangle.cpp:在构造函数'shapes :: rectangle :: rectangle(int,int)'中: Rectangle.cpp:10:错误:在此范围内未声明'weight' Rectangle.cpp:在构造函数'shapes :: rectangle :: rectangle()'中: Rectangle.cpp:17:错误:在此范围内未声明'weight'

那么,为什么第一个程序“看到”int * p_x而第二个程序看不到int * weight?我一直在试图弄清楚我在做什么不同而无处可去。

2 个答案:

答案 0 :(得分:2)

Rectangle.cpp的正确语法是:

#include "Rectangle.h"
#include <cstddef>

namespace shapes {

rectangle::rectangle(int h, int w)
{
    height = h;
    width = w;
    weight = NULL;
}

rectangle::rectangle()
{
    height = 0;
    width = 0;
    weight = NULL;
}

int rectangle::area ()
{
    return height * width;
}

void rectangle::setHeight(int h)
{
    height = h;
}

void rectangle::setWidth(int w)
{
    width = w;
}

void rectangle::setDimensions(int h, int w)
{
    height = h;
    width = w;
}

} // namespace shapes

我的GCC-4.4.5和MSVC处理您的using namespace变体也可以。但根据当前标准(您指定::rectangle::area()等,而不是::shapes::rectangle::area()等),它是不正确的。)

答案 1 :(得分:1)

您显示的代码中没有错误。也许你的机器上的Rectangle.h中的int *wight声明中有拼写错误,但你在这里发布了正确的代码。