2012-02-05 6 views
2

Я использую C++ для очень небольшой части моего проекта. Я должен что-то неправильно кодировать, но мои знания о 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.

ответ

6

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

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

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

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

+0

Эй спасибо за это объяснение :) Отличное решение! n.b. id AbstractContactListener действительно был объявлен вне образца кода. Спасибо за указание, хотя ;-) – Jem

2

Вы забыли имя класса из

void isFixtureCollidingWithFixtureOfType(b2Fixture fix, int type) 
+0

Привет, спасибо! Хорошо заметили :-) – Jem

2

ничтожной AbstractContactListener :: isFixtureCollidingWithFixtureOfType (b2Fixture починки, целого типа)

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

:)

+0

Хорошо! В самом деле, большое спасибо! – Jem

 Смежные вопросы

  • Нет связанных вопросов^_^