Компилятор говорит, что указатель находится вне области видимости.Какую базовую вещь я делаю неправильно? - PullRequest
1 голос
/ 04 апреля 2011

Хорошо, я столкнулся с некоторой непоследовательностью, и это ведет меня к дыре размером с кулак в моем мониторе, которую я бы лучше избегал.

Я прохожу учебник по SDL на www.sdltutorials.com (учебник по sdl-tutorial-basics, я уверен, что Тим Джонс прошел через несколько человек), и я столкнулся с ошибкой: '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: В конструкторе ‘shape :: rectangle :: rectangle (int, int)’: Rectangle.cpp: 10: ошибка: «вес» не был объявлен в этой области Rectangle.cpp: в конструкторе ‘shape :: rectangle :: rectangle ()’: Rectangle.cpp: 17: ошибка: «вес» не был объявлен в этой области

Итак, почему первая программа может "видеть" int * p_x, а вторая не может видеть int * weight? Я пытался понять, что я делаю по-другому, и ничего не получил.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Правильный синтаксис для 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 голос
/ 04 апреля 2011

У вас нет ошибок в показанном вами коде.Возможно, у вас есть опечатка в объявлении int *wight в Rectangle.h на вашем компьютере, но вы опубликовали правильный код здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...