스택에 할당된 오브젝트를 복사하면서 생긴 문제가 아닐까 생각 합니다.
CFriend 에 카피 컨스트럭터가 없는데요.
디스트럭터등도 없고요.
카피 컨스트럭터, 대입 연산자, 디스트럭터를 만들어서 완벽한 클래스로 만들고 나서 하시는게 어떨까요?
그리고 STL컨테이너를 사용할때는 보통 복사의 부담을 줄이기 위해, 객체를 직접 집어넣기보다는 객체의 포인터를 집어넣는 방법을 많이 사용 하는걸로 알고있습니다.
추신 소스코드 전체를 올려주신건지는 잘 모르겠지만, 윈도우 컴파일러에서는 잘 되는것 같군요. 지금 제 곁에 리눅스머신이 없어서, 리눅스에서는 체크해 보지 못했습니다.
add 멤버 함수 안에 왜 list<...> 변수를 만드셨죠?
그리고, insert 대신 push_back 가 좀 더 나아보입니다.
윗분 말씀대로 구조체가 좀 커지면 포인터를 사용하는 것이 좋고 (vector나 deque 는 이리 저리 복사하느라 시간이 좀 들구요. list 는 실제로 복사하지는 않겠죠) 이럴 때, 삭제시 골치아픈 문제는 생-날짜 포인터말고 스마트 포인터로 해결한다고 합니다.
구조체를 list 에 넣으세요.
string 처럼요.
똑같답니다.
다시 질문입니다
아래와 같이 코딩하면 될 것 같은데 insert 할때 에러가 나네요
(아 제가 사용한건 구조체가 아니라 클래스였네요)
list<_CFriend> liFriend;
class CFriend cFriend;
liFriend.insert(liFriend.end() , cFriend);
=============================
테스트로 아래와 같이 하니까 insert 가 되던데요
class는 왜 안될까요?
list<char> list1;
list1.insert(list1.end(), 'a');
list1.insert(list1.end(), 'b');
list1.insert(list1.end(), 'c');
작은 행복
생각할 수 있는 것은 여러가지 있습니다만...
error message 를 보여주셔야 확실히 알겠군요.
string 이라고 해서 string class 인 줄 알았더니 char 였군요...
제가 생각하기에는 list 와는 다른 부분에서 error 가 났을 것 같군요.
그리고 사용하고 계시는 environment 를 적어주시기 바랍니다.
예 클래스를 insert 할때만 에러가 나는 것 같아요!!
//////////////////////////////////////////
class CFriend
{
public :
char cState;
short snNum;
CFriend(); // constructor
};
//////////////////////////////////////////////
class User
{
char cState;
list<CFriend> liFriend;
list<CFriend>::iterator pliFriend;
public:
void add()
};
void User::add()
{
list<CFriend> liFriend;
class CFriend cFriend;
liFriend.insert(liFriend.end() , cFriend); // 에러가 나는 라인 !!
}
============================================
위와 같은 구조로 되어있고요
Segmentation fault 에러가 나네요
제가 테스트 해봤더니 char 나 일반 구조체를 insert 할때는
문제가 없는데 class 개체를 가지고 하면 segmentation 에러가 T.T
작은 행복
CFriend 에 카피 컨스트럭터가 없는데요.
스택에 할당된 오브젝트를 복사하면서 생긴 문제가 아닐까 생각 합니다.
CFriend 에 카피 컨스트럭터가 없는데요.
디스트럭터등도 없고요.
카피 컨스트럭터, 대입 연산자, 디스트럭터를 만들어서 완벽한 클래스로 만들고 나서 하시는게 어떨까요?
그리고 STL컨테이너를 사용할때는 보통 복사의 부담을 줄이기 위해, 객체를 직접 집어넣기보다는 객체의 포인터를 집어넣는 방법을 많이 사용 하는걸로 알고있습니다.
추신 소스코드 전체를 올려주신건지는 잘 모르겠지만, 윈도우 컴파일러에서는 잘 되는것 같군요. 지금 제 곁에 리눅스머신이 없어서, 리눅스에서는 체크해 보지 못했습니다.
어떻게 compile 이 되죠?
compile 이 안되어야 할텐데 Segmentation Fault 가 뜬다니...
Default 생성자를 만드셨군요. 그렇다면 복사생성자는 명시적으로 만들어주셔야 합니다.
만약 Default 생성자가 하는 역할이 없다면 그냥 Default 생성자를 없애는 것도 생각해 볼 수 있죠...
그러면 struct 처럼 동작할 겁니다.
무슨 책 보는지 궁금합니다.
code 가 좀 희한합니다. 여러가지로...
어느 책을 보더라도 차분히 읽어보세요.
add 멤버 함수 안에 왜 list<...> 변수를 만드셨죠?
add 멤버 함수 안에 왜 list<...> 변수를 만드셨죠?
그리고, insert 대신 push_back 가 좀 더 나아보입니다.
윗분 말씀대로 구조체가 좀 커지면 포인터를 사용하는 것이 좋고 (vector나 deque 는 이리 저리 복사하느라 시간이 좀 들구요. list 는 실제로 복사하지는 않겠죠) 이럴 때, 삭제시 골치아픈 문제는 생-날짜 포인터말고 스마트 포인터로 해결한다고 합니다.
stl container에 들어가려면, 복사생성자 꼭 만드시고, 순서 없
stl container에 들어가려면, 복사생성자 꼭 만드시고, 순서 없는 container에 들어가도록 하려면, less 연산자도 만드셔야합니다.
전 bugii 님말대로 pointer container로 만들것을 추천합니다.
저런거 모두 만들기 귀찮아서..
그리고, stl 구현을 잘 살펴보면, string 을 포함한 다른 놈들은 대새 reference counting 기법을 사용합니다. 만드시려면, 단순한 복사 생성자 말고, 저런 기법을 도입하셔서 만들어 보세요.
---
http://coolengineer.com
댓글 달기