Ошибка кодирования новичка в C ++: «необъявленный идентификатор»? - PullRequest
2 голосов
/ 05 февраля 2012

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

См. Оба файла AbstractContactListener.h и .mm ниже. Проблема в методе isFixtureCollidingWithFixtureOfType (...), я не могу получить доступ к вектору _contact. Что я могу здесь делать не так?

Заголовок:

struct JRContact {
    b2Fixture *fixtureA;
    b2Fixture *fixtureB;
    bool operator==(const JRContact& other) const
    {
        return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);
    }
};

class AbstractContactListener : public b2ContactListener {

    id contactHandler;

public:
    std::vector<JRContact>_contacts;

    AbstractContactListener(id handler);
    ~AbstractContactListener();

    void isFixtureCollidingWithFixtureOfType(b2Fixture fix, int type);

    virtual void BeginContact(b2Contact* contact);
    virtual void EndContact(b2Contact* contact);
};

Реализация:

AbstractContactListener::AbstractContactListener(id handler) : _contacts() {
    contactHandler = handler;
}

AbstractContactListener::~AbstractContactListener() {
}

void isFixtureCollidingWithFixtureOfType(b2Fixture fix, int type){

    std::vector<JRContact>::iterator ct;

    // Next line is faulty... can't call _contacts.begin()
    // xCode says: "Use of undeclared identifier _contacts"
    ct = _contacts.begin();
}


void AbstractContactListener::BeginContact(b2Contact* contact) {
    // ...
}

void AbstractContactListener::EndContact(b2Contact* contact) {
    // ...
}

Необъявленная? Хм. Я думал, что объявил это в заголовке, сразу после ключевого слова public:

Что я могу здесь делать не так? большое спасибо! J.

Ответы [ 3 ]

6 голосов
/ 05 февраля 2012

Вы забыли добавить область действия функции. Попробуйте:

void AbstractContactListener::isFixtureCollidingWithFixtureOfType(b2Fixture fix, int type){

Почему ошибка указывает вам на это странное место? Компилятор видит определение вашей функции и думает, что это бесплатная функция, поскольку нет ничего, что указывает на обратное, и пытается обработать ее как таковую. Сбой, потому что он пытается найти переменную в глобальной области видимости. Это может стать еще смешнее (читай: более запутанно): изображение, что эта функция не использует члена класса. Он будет просто проанализирован и скомпилирован как свободная функция. Как только вы попытаетесь вызвать его для объекта такого типа, вы получите ошибку компоновщика.

Кроме того, я не вижу объявления типа id, который используется в AbstractContactListener, но это может быть только потому, что пример кода неполон.

2 голосов
/ 05 февраля 2012

void AbstractContactListener :: isFixtureCollidingWithFixtureOfType (исправление b2Fixture, тип int)

В реализации.

:)

2 голосов
/ 05 февраля 2012

Вы забыли название класса из

void isFixtureCollidingWithFixtureOfType(b2Fixture fix, int type)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...