2014-01-29 2 views
0

클래스와 float 포인터를 같은 의미로 사용하는 방법이 있는지 궁금합니다. 클래스는 기본적으로 double 형태의 배열 (고정 크기)입니다. 클래스 포인터가 있으면 해당 연산자를 사용하여 쉽게 float 포인터로 사용할 수 있지만 포인터가 있으면 자동으로 클래스로 사용하는 방법을 모르겠습니다.클래스를 float 포인터로 바꾸어 사용하십시오.

내 문제를 좀 더 설명하겠습니다. 나는 4 × 4 행렬을 보유 할 Matrix4x4의 형식 정의를 사용하고있다 :

typedef float Matrix4x4[16];

나는 float* 으로 Matrix4x4을 기능의 많은 지금은 같은 방법으로 기본 클래스를 사용하는 것을 시도하고있다 I

bool test(void){ 
    float H[16]; 
    // ... process H 
    return isIdentidy(  H); // I want the compiler to accept it this way 
    return isIdentidy((float*) H); // or this way 
} 
bool isIdentity(const Matrix4x4 matrix){ 
    ... (process) 
    return ...; 
} 
:이 같은 함수를 호출 할 때

class Matrix4x4 { 
    float matrix[16]; 
public: 
    Matrix4x4(); 
    float operator[](int i){ 
     return matrix[i]; 
    } 
    operator float*() const{ // I can pass to functions that take a float* 
     return (float*) matrix; 
    } 
}; 

문제는 남아 다음 Matrix4x4를 사용하는 데 사용3210

결국 포인터는 똑같아 야합니까? 내가 대신 float H[16]

Matrix4x4 H로 H를 선언하는 경우

(static_cast 또는 dynamic_cast는을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

가 없다 매우

답변

1

주셔서 감사합니다 당신이 원하는 것을 할 수있는 방법이지만, 매우 비슷한 것을 할 수 있습니다.

먼저 float [16] 인수를 받아들이는 Matrix4x4의 새로운 생성자를 만듭니다

class Matrix4x4 { 
    float matrix[16]; 
public: 
    Matrix4x4(); 
    Matrix4x4(float values[16]) 
    { 
     memcpy(matrix, values, sizeof(float)*16); 
    } 
    float operator[](int i){ 
     return matrix[i]; 
    } 
    operator float*() const{ 
     return (float*) matrix; 
    } 
}; 

그런 다음 새로운 Matrix4x4에

bool test(void){ 
    float H[16]; 
    // ... process H 
    return isIdentidy(Matrix4x4(H)); 
} 
bool isIdentity(const Matrix4x4 matrix){ 
    ... (process) 
    return ...; 
} 

변경이 비록 손실됩니다 할 수 있습니다.

+0

이 솔루션에 대해 감사드립니다. 그것은 매우 유용합니다. 그러나 나는 매트릭스를 많이 사용함에 따라 속도에 대해 상당히 염려합니다. 따라서'typeded float Matrix4x4 [16] '을 사용하여 기존 방법을 유지할 수 있습니다. 또한 포인터를 전달하여 변경하려고합니다. 포인터 만 저장하는 Matrix4x4 클래스 생성자를 변경하는 것이 가능할 것이라고 확신하지만 데이터를 저장하려면 너무 복잡해집니다 ... 어쨌든, 정말 고마워요! – Albert

관련 문제