g++ 문법은 표준 C++지원이 미약 한가요?
글쓴이: onemind555 / 작성시간: 화, 2003/10/28 - 11:43오전
class Base{
..
}
class Deriven{
...
}
class In {..}
Deriven d;
Base &b = d;
dynamic_cast<Deriven &>(b);
이런 문법의 사용이 안 되는데 해결 방법 있는가요.. Deriven을 struct로 인식 하면서 컴파일 에러가 나옵니다.
그리고 안되는것 또한가지..
Deriven클래스 생성 자라고 가정 att는 Deriven멤버 변수
Deriven () : att(new In()) {
}
저런식으로 초기화 내부에 클래스 사용도 안 되는 것 같은데 방법 없나요??
gcc버젼은 레드헷 리눅스 9.0에 깔려 있는 것입니다.
Forums:
...
...트릭 같은 것이라도 없을 까요..
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
dynamic_cast<>() 는 가상함수를 포함하지 않는 자
dynamic_cast<>() 는 가상함수를 포함하지 않는 자료형에는
사용할 수 없다고, 알고만있는데.....
Base와 Deriven 의 상속관계에서 가상함수가 포함되어 있는지요?
확인하시고, 결과를 말씀해 주시면 감사하겠습니다.
해결 했습니다..
그부분이 아니고 다른 곳에서 문제가 일어 나더군요..
인라인으로 된 함수들은 cpp로 다 옮기고 #include도 cpp로 옮기니 되더군요..
VC에서 돌아 가던 소스 였는데..
GCC는 의존성 문제부분에서 약한 면을 가진듯 하네요..
그리고 에러 처리부분도 약하고 에러난 부분에서 에러를 안 일으키고 엉뚱한 곳에서 일으키는 것을 보니...
그리고 또 알아 낸것은 ...
GCC에서 잘 안 되는것 하나가 함수 인자 넣는 부분에서 객체를 자동 생성 하는 것이 가끔 안 되는 것이 있더군요.. 그래서 앞에 임시 변수를 하나 두어 해결 했습니다.
가령 이런거 말이죠..
Func(myClass() );
이런게 잘 안 되더군요.
myClass aaa;
Func(aaa);
이런식으로 하면 잘 되더군요..
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
...
저는 그런적이 없었는데...혹시 Func 가 const myClass 를 받지 못했던것 아닐까요..? Func(const myClass&) 로 선언되어야 Func(myClass()) 로 사용할 수 있을테니까요. 그런 기본적인 것이 컴파일 되지 않을 까닭이 없습니다.
------------------
함수 선언에서 & 기호를 빼먹었었습니다...-_-; 수정합니다.
문제가 있긴 있습니다.
함수는
void Fun(Base &);
함수 호출을
Fun(Deriven()); 이런식으로 하니 에러가 나는 듯 하군요.
정확한 재연은 찾기 귀찮아 생략 합니다. 이해 바랍니다..
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
Re: 해결 했습니다..
만일 인라인 문제라면 컴파일러 옵션의 디폴트가 inline을 못쓰게 해서 일겁니다. 저도 g++을 사용할때 겪은 문제인데 inline키워드를 쓰게하는 옵션을 셋팅하고 컴파일을 해보시기 바랍니다...
[quote]함수는void Fun(Base &);함수
위에서 다른 분이 말씀하셨는데
Fun(Deriven());
로 호출하려면 함수선언이
void Fun(const Base &); 나
void Fun(Base );
로 되어있어야 합니다.(밑의 것은 정상적으로 작동하지 않을 확률이 높음)
에러가 나는게 당연한 것이고 vc++ 에서 컴파일이 된다면(경고도 한마디 없다면) vc++ 쪽이 잘못된 것입니다.
이게 표준이 아니었는가요..
Deriven deriven;
Func(deriven) ;
이나
Func(Deriven());
이것과 별로 차이점이 없는 걸로 아는데... 차이점은 변수의 생존 기간 이겠지만... 경고 날릴 필요도 없고 문제가 없는 코드 아닌가요..
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
void Fun(Base &); 이렇게 선언을 하고
void Fun(Base &);
이렇게 선언을 하고
Fun(Deriven());
이렇게 호출하면 임시로 Deriven 객체가 만들어져서 매개변수로 넘어갑니다.
그런데 함수가 참조를 받기 때문에 이 임시객체를 수정할 수가 있습니다.
그런데 임시객체를 수정하는 것은 아무 의미가 없습니다.(수정해봤자 함수가
끝나고 나면 없어지므로 소용이 없죠. 수정해서 리턴하면 되지 않느냐고 하실지
모르겠는데 그런경우는 참조가 아니라 값으로 받게 하는게 났습니다.)
그래서 컴파일러에서 이렇게 코딩하면 에러로 간주하고(아마 프로그래머가
실수한 거라고 판단한 거겠죠.) 컴파일을 중단하는 것입니다.
하지만 상수 참조를 넘길 경우에는 아무 문제가 없습니다. 받은 참조를 수정하지
않기 때문에 임시객체를 넘겨도 문제가 없는 것이죠.
그렇군요..
미처 생각 못했던 부분이군요..
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
댓글 달기