|
생성자에서 const에 대한 이해가 부족해서 생긴것 같네요.
'const'로 지정되면 값이 변하지 않는다는 의미입니다.
const에 대해서 책을 찾아 보세요.
char * hobby; <= hobby의 값은 바꿀수 있습니다.
const char * ho; <= ho의 값은 바뀔수 없는 것입니다.
hobby = ho; <= ho의 값을 바꿀수 없는데, hobby에 그 주소값을 주면
ho의 값을 바꿀수 있기 때문에 컴파일러가 에러를 보여줍니다.
hobby = (char *)ho; <= 따라서 ho의 값을 변경할수 있게 ho의 타입을 강제적으로
바꾸었군요. 좋은 방법은 아니네요..
오히려 class만들적에,
다음줄을
cow(const char * nm, const char * ho, double wt);
이렇게 바꾸시구요.
cow(const char * nm, char * ho, double wt);
함수에서도
cow::cow(const char * nm, char * ho, double wt)
{
...
}
으로 바꾸시면, 캐스팅 안해도 됩니다.
또한 *hobby = *ho; 줄은 hobby가 가리키는 주소에 *ho의 값을 복사하는 것인데,
hobby의 주소는 초기화 해주질 않았으므로 어디를 가르킬지 모릅니다.
메모리 참조 에러가 나는 것은 당연한 것이겠지요.
exkarion 님이 쓰신 글 :
: 어설픈 클래스를 만들긴 했는데요....
:
: 생성자를 오버로드를 몇개 만들긴 했는데....
:
: 캐스트 연산자를 안쓰니 제대로 돌아가질 않는군요....
:
: class cow
: {
: private:
: char name[20];
: char * hobby;
: double weight;
: public:
: cow();
: cow(const char * nm, const char * ho, double wt); //이부분의 생성자가
: cow(const cow & c);
: ~cow();
: cow operator=(const cow & c);
: void showcow();
: };
:
: cow::cow(const char * nm, const char * ho, double wt) //이겁니다.
: {
: strcpy(name, nm);
: hobby = (char*)ho; //이렇게 쓰면 제대로 컴파일됩니다. 근데 hobby = ho; 라고 쓰면...
: weight = wt;
: }
:
: 제대로 컴파일이 안되고.... *hobby = *ho; 라고 쓰면 컴파일은 되는데
:
: 실행시 메모리 참조 에러가 생기는군요......
:
: 아직 포인터에 대한 이해가 모자란 걸까요......흠.....
:
: 둘다 캐릭터형 포인터인데...흠.....헷갈리네요....
:
: 좋은 답변 부탁드리고 혹시 포인터에대한 이해를 도울만한 내용을 알고 계신분은
:
: 알려주심 감사하겠습니다.
|