2010-07-12 5 views
0

У меня есть C++ объект, который я получаю ссылку на на мой взгляд контроллера, как это:Вызов класса C++ внутри контроллера вида аварий

m_applicationEngine = (ApplicationEngine *)[(GLView *)[self.parentViewController view] m_applicationEngine]; 

В моем месте делегатом я называю methid в класс как это:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation  *)newLocation fromLocation:(CLLocation *)oldLocation { 
CLLocationCoordinate2D coordinate = [newLocation coordinate]; 

NSLog(@"Location acquired %f, %f", coordinate.latitude, coordinate.longitude); 
myLocation = new Location(coordinate.latitude, coordinate.longitude); 

m_applicationEngine->GotoLoc(myLocation); 
} 

это вызов функции GotoLoc, но он выходит из строя в первый раз функция обращается публичным переменный экземпляр m_applicationEngine. Я уверен, что член уже инициализирован. У кого-нибудь есть идеи?

m_applicationEngine - объект C++, инициализированный в initWithFrame() в GLView: UIView.

m_applicationEngine = new ApplicationEngine(m_renderingEngine, self); 

Адрес: GotoLoc(). В первый раз он ссылается на m_rotation, который является переменной-членом класса, который он выдает. Я могу вызвать GotoLoc() в других областях кода, просто не в вышеупомянутой функции делегата Obj-C.

void ApplicationEngine::GotoLoc(Location *location) { 
vec3 eye = vec3(0, 0, 1); 
vec3 end = location->loc; 

// Compute the difference between where we're looking at now vs. where we want to point 
mat4 transpose; 
MatrixTranspose(transpose, m_rotation); 
MatrixVec3Multiply(eye, eye, transpose); 

//cout << "Inverse. I was here x:" << relativeVec.x << " y:" << relativeVec.y << " z:" << relativeVec.z << endl; 

// bring vectors down to the equator to measure x angle 
vec3 relativeX = vec3(eye.x, 0, eye.z); 
// reference vector is the rotation axis for the sign to be correct 
float xAngle = signed_angle(relativeX, vec3(end.x, 0, end.z), vec3(0,-1,0)); 

mat4 rotationX; 
MatrixRotationY(rotationX, -1 * xAngle); 
MatrixMultiply(m_rotation, rotationX, m_rotation); 

// need to rotate eye vector to line up on y with new target to measure y angle 
MatrixTranspose(transpose, rotationX); 
MatrixVec3Multiply(eye, eye, transpose); 
float yAngle = signed_angle(eye, end, vec3(1,0,0)); 

cout << "Went to difference of: ANGLE x: " << RADIANS_TO_DEGREES(xAngle) << " y:" << RADIANS_TO_DEGREES(yAngle) << endl; 

mat4 rotationY; 
MatrixRotationX(rotationY, -1 * yAngle); 
MatrixMultiply(m_rotation, m_rotation, rotationY); 

}

+0

Что такое код для местоположения и m_applicationEngine – Mark

ответ

0

Best догадка на информацию, которую вы дали нам, что m_applicationEngine на самом деле не является C++ объект. Где вы его создаете? в init? в аксессуре m_applcationEngine?

Если вам нужен лучший ответ, покажите нам код GotoLoc() и как вы начинаете объект C++.

Редактировать (следующий новый публикуемый код):

Я думаю m_applicationEngine является недействительным. Вы должны быть в состоянии подтвердить, что, положив разрыв в первой строке GotoLoc() и проверив this (это правильно для C++? Я хочу эквивалент self).

Если ваше мнение в файле nib, у меня есть чувство initWithCoder: вместо initWithFrame:, которое объясняет, почему ваш объект C++ никогда не строится. Самый простой способ исправить это - создать и получить доступ к нему через свойство и инициализировать его при первом использовании, например.

// .h file 

@property (readonly, assign) ApplicationEngine* applicationEngine; 

// .m file 

-(ApplicationEngine*) applicationEngine 
{ 
    if (m_applicationEngine == NULL) 
    { 
     m_applicationEngine = new ApplicationEngine(m_renderingEngine, self); 
    } 
    return m_applicationEngine; 
} 
+0

Спасибо за ответ. Я обновил свой вопрос кодом, который вы просили. – paranoidroid

+0

Спасибо за помощь. Я понял это, self.parentViewController в верхней строке кода был равен нулю, поэтому я никогда не получал действительный указатель на m_applicationEngine. – paranoidroid

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