'형식 캐스팅' : ...로의 변환이 있지만 액세스할 수 없습니다.
2010. 7. 20. 23:01 in C/C++/에러도우미

CTest* a;
CParent* p = (CParent*)a;
등과 같이 부모클래스로 캐스팅할때..
아래처럼 실수로 쓰지 상속관계를 정의하지 않은 경우에 private으로 자동설정되어 접근할 수 없어 발생하는 에러다. 간단히 상속관계를 public으로 바꿔주면 해결된다.
CTest : CParent
{
};
를..
CTest : public CParent
{
};
로 바꿔주면 된다.
애초에 private 상속은 두가지 규칙을 가진다. 아래는 Effective C++에 나온 부분을 발췌한것.
첫번째로 부모클래스로의 변환불가
두번째로 부모클래스의 멤버들이 자식클래스의 private 멤버가 된다.(출처 Effective C++)
기타..
두번째로 부모클래스의 멤버들이 자식클래스의 private 멤버가 된다.(출처 Effective C++)
기타..
따라서 저런 에러가 발생하는 것이다.
'C/C++ > 에러도우미' 카테고리의 다른 글
기본 클래스를 정의하지 않았습니다. (0) | 2010.06.15 |
---|---|
교차 포함 시 대량의 오류가 발생하는 경우 (3) | 2010.06.13 |
증가연산자 혹은 증감연산자 사용시 주의사항 (0) | 2010.04.26 |
소스 파일이 모듈을 빌드했을 때와 다릅니다. 현재 위치에 사용할 수 있는 소스 코드가 없습니다. (1) | 2010.04.23 |
메모리릭 검출 중에 황당한 오류를 접한 경우 (0) | 2010.04.21 |
에러가 났었습니다... 여러가지 이유가 있었겠지만 그림자가 생긴걸 봐서는.. 렌더링이 잘못되었겠군요.
저런 경우 거의 대부분이 렌더링 문제입니다.. 그리고 실제 깨어진모델과 그의 그림자가 동시에 나온걸 봐서는.. 그림자를 그린 부분만 에러가 났다던지 하는 국소적인 문제는 아닌것 같았습니다.
생각해본 원인은 버텍스버퍼가 잘못되었다던지.. 인덱스 버퍼가 잘못되었다던지.. 버텍스 셰이더에서 버텍스를 잘못 건드려줬다던지.. 엉뚱한 곳에 픽셀셰이더로 칠했다던지...하지만 픽셀셰이더는 모델이 렌더링되는 부분에만 생기는 것이라.. 더욱이 그림자까지 생겼으므로 픽셀셰이더는 아니었습니다.
그럼 버텍스버퍼, 인덱스버퍼, 버텍스 셰이더로 좁혀지는데, 버텍스 셰이더의 경우 현재 스키닝처리가 확률이 컸었는데.. 만약 스키닝이 잘못되었다면 버텍스가 연결되어있어 결과적으로 깨진 모델의 일부분이 스키닝 모델과 계속 붙어다니는 현상을 보게 될텐데.. 저 위 모델은 스키닝 모델인데도 불구하고 전혀 깨지지 않았으니 버텍스 셰이더 문제도 아니었습니다.
그렇다면 버텍스 버퍼문제 또는 인덱스 버퍼의 문제였는데.. 아래를 보면 깨진 모델의 어떤 정점이 0,0,0으로 향하는 것을 볼 수 있습니다. 이것은 기본값 내지, 쓰레기값을 참조하고 있는 경우라고 생각되었습니다. 그리고 현재 뛰어다니는 모델들과는 전혀 상관없는, 지형쪽의 버텍스 버퍼나 인덱스 버퍼가 잘못된 걸로 추측되었습니다.
그러니까.. 지형의 버텍스 버퍼와 인덱스 버퍼의.. 버텍스 개수, 인덱스 삼각형 개수 등이 잘못되어 각 개수의 한계치를 넘게 가져온다던지 하는 것이겠죠.(메모리 침범이 되겠네요) 실제로 제가 설계한 인덱스 버퍼에서는 생성할 때, 삼각형의 개수를 저장시키고, Draw를 할 때 저장했던 삼각형 개수를 리턴해서 primitivecount를 세팅하곤 했었습니다.
먼저 버텍스버퍼.. 지형의 버텍스는 일반적인 높이맵을 사용한 것으로.. 상당히 심플합니다. 따라서 패쓰..
남은건 인덱스 버퍼인데, SLOD기법으로 해서 인덱스 버퍼가 좀 많았죠. 인덱스 버퍼를 살펴보다가 인덱스 버퍼를 세팅하는 부분에서 파라메터를 잘못 설정해주는 실수를 범했었습니다. 삼각형의 개수를 잘못 지정했고, 그걸 렌더링할때 파라메터로 넘겨줬던거죠. 근데.. 지형은 참 오래전에 완성했었는데.. 이제서야 이렇게 나오니까 솔직히 지형쪽에 문제가 있으리라곤 상상도 못했었습니다. 뭐죠? 오래하다보니 점점 심볼들이 늘어나서 평소에는 침범해도 별 해가 없다가(또는 0,0,0의 인덱스만 가져오다가) 프로그램 심볼들이 늘어나서 침범하고, 이상한 인덱스값으로 세팅하는 건가요? 흐음. 아무튼 인덱스 버퍼의 문제였었습니다.
그예로 지형의 버텍스만 참조하는 것을 볼 수 있습니다^ㅡ^ 참고로 뛰어다니는 모델들한텐 붙어있지 않았어요.
'작업일지' 카테고리의 다른 글
캐릭터 충돌처리 (1) | 2010.07.07 |
---|---|
오리엔테이션 생성중 실수. (0) | 2010.07.05 |
그림자 처리.. (0) | 2010.06.26 |
Perspective Shadow Map.. (0) | 2010.06.22 |
뭐.. private에 선언한 struct나 class를 외부에서 쓰고 싶은 경우엔.. 그냥 public에 선언해버리면 되지만.. 무조건 public보다 외부에 알리는데는 이런 심볼이름을 해야겠다.. 라는 정의가 필요할 수 있다. 집안에선 자랑스런 남편이고 아들일테고 밖에서는 또 역할이 다르지 않은가? 여튼 고민하시고 혹시나 필요하신 분을 위해...
-------- A.h --------
#include "B.h"
class A
{
B::BST* st;
};
-------- B.h --------
class B
{
public:
typedef struct ST BST;
private:
struct ST
{
};
};
#include "B.h"
class A
{
B::BST* st;
};
-------- B.h --------
class B
{
public:
typedef struct ST BST;
private:
struct ST
{
};
};
'C/C++ > 프로그래밍 일반' 카테고리의 다른 글
컴파일러에 암시 또는 힌트 (0) | 2010.07.08 |
---|---|
리다이렉션(< or >)을 활용한 파일입출력 (0) | 2010.05.31 |
ZeroMemory (1) | 2010.04.29 |
memset, memcpy, memmove, memcmp 멤형제들 (0) | 2010.04.29 |
c/c++에서의 일반변수, 포인터변수, 메모리에 대해 (2) | 2010.04.29 |