2009-09-07 6 views
2

예제 코드 예상대로이렇게 배열을 캐스트 할 수 있습니까?

#include <cstdlib> 
#include <iostream> 
using namespace std; 

class A { 
public: 
    A(int x, int y) : x(x), y(y) {} 
    int x, y; 
}; 

class B { 
public: 
    operator A() { 
     return A(x,y); 
    } 
    float x, y; 
}; 

void func1(A a) { 
    cout << "(" << a.x << "," << a.y << ")" << endl; 
} 

void func2(A *a, int len) { 
    for(int i=0; i<len; ++i) { 
     cout << "(" << a->x << "," << a->y << ")"; 
    } 
    cout << endl; 
} 

int main(int argc, char** argv) { 
    B b[10]; 
    func1(b[0]); 
    //func2(b, 10); 
    return(EXIT_SUCCESS); 
} 

func1 작동하지만 func2은 컴파일 타임 오류가 발생합니다. 이 작품을 만들기 위해 클래스 B에 추가 할 수있는 것이 있습니까? 나는 의심하지 않지만 물어 보는 것이 좋지 않습니까?

A의 크기가 B의 크기와 다르기 때문에 정상적으로 작동하지 않는다고 가정합니다.

+0

그래, 나도 그래 ................. – stefanB

+0

내가 그랬어. 감사합니다 – mpen

+0

그래서 ... 어떻게 연산자'A()'를 추가 할 수 있습니까? – mpen

답변

1

배열에 메서드를 전달할 때 배열의 실제 복사본이나 첫 번째 요소가 아닌 첫 번째 요소의 주소 만 전달합니다.

func1에서는 B 그것이 AB 변환하고 클래스 A 새로운 객체는이 포인터를 전달 func2에서 func1

에 전달 operator A() 있기 때문에 클래스 B.의 목적은 어레이의 첫 번째 요소를 전달할 A 객체의 배열과 같지 않은 B 객체의 배열이므로 오류가 발생합니다.

해결하려면 B와 iterator의 배열에 대한 포인터를 취하고 각 호출에 대해 func1 또는 이와 비슷한 메소드를 사용할 수 있습니다. 당신이 func2에 유형 B의 포인터를 전달하려고하면

+0

루프를 사용하지 않고 해결하고 싶습니다. 내가 어떻게하는지 안다. 그러나 나는 그것이 가능하지 않다고 생각한다. 감사합니다 – mpen

5
void func2(A *a, int len) 

B*에서 A*에는 허용되는 변환이 없습니다. AB의 두 가지 유형이 있지만 B 유형은 A 유형의 변환 연산자가 있습니다.

+0

그럼 실제로는 유효한 해결책이 아닙니다. 이 문제는'func2'가 제 3 자 라이브러리의 일부라는 점에서 문제가 있습니다. 나는'func2'가'A' 또는'B'를 받아 들일 것을 원합니다. 그럼에도 불구하고, 나는 귀하의 단락이 그 질문에 답할 것이라고 생각합니다. – mpen

1

기타 답변으로 핵심 문제를 해결했습니다. 하지만 완전성을 위해, 그것은 주목할 필요가 I가의 크기가 크기 B의 다르기 때문에 작동하지 않습니다 가정

인가?

올바르지 않습니다.

먼저이 예제에서 주어진 A와 B는 현재 많은 컴파일러에서 실제로 같은 크기입니다.

비록 A와 B가 같은 크기 일지라도 컴파일러는 이러한 종류의 변환을 자동으로 수행하지 않습니다. 사실, 멤버 변수의 메모리 레이아웃이 정확히 같더라도 컴파일러는 여전히 그렇게하지 않습니다.

+0

글쎄, 내 논리는 포인터 연산이 (꼭) 작동하지 않기 때문에 받아 들일 수 없다는 것이었다. 그것은 마치 B인데도 A 인 것처럼 작동하려고합니다. – mpen

관련 문제