클래서에 복사생성자를 선언 정의할 경우에 함수에서 레퍼런스로 그 클래스 타입을 받아올 수 없나요?
글쓴이: mydream / 작성시간: 수, 2015/09/30 - 12:49오후
A 클래스가 있고
A(A&) { //statement } void testf(A&) { //statement } int main() { A hh; testf(hh); }
위와 같이 했을 때, testf에서 받아들인 매개변수의 값은 완전히 저 hh를 참조하고 있는 것인가요? 생성자 때문에 이상한 방식으로 값이 들어가는 경우가 있는 것 같습니다. 복사생성자를 정의했을지라도 참조로 인자 받을 수 있는 방법이 뭔가요? 클래스에 무엇을 더 정의해놓아야 하나요?
Forums:
...
1. 저렇게 하면 복사생성자가 불리지 않아야 할 텐데요.
2. 문제가 그게 아닐 확률이 매우 높은데, 이렇게 질문하면 아무도 답변을 드릴 수가 없습니다. 컴파일이 되면서 실행하면 똑같은 문제가 발생하는 소스를 20줄 이내로 만들어서 보여주세요.
소소의 일부분입니다. MemDC를 인자로 받는 ConfirmDisplay에서 fullDC가 좀 이상합니다.
class Brick {
private:
RECT block;//private
HBITMAP hBrickBitmap;//private
BITMAP brickInfo;//private
public:
/*RECT block;//private
HBITMAP hBrickBitmap;//private
BITMAP brickInfo;//private*/
Brick();
Brick(Brick& brick);
Brick(POINT _pos, HBITMAP _hBrickBitmap);
HBITMAP getHbitmap();
void initBrick(POINT& _pos, HBITMAP _hBrickBitmap);
void setPos(POINT& _pos);
POINT getPos();
LONG getEndX();
LONG getEndY();
LONG getFirstX();
LONG getFirstY();
void setFirstX(LONG _rect_left);
void setFirstY(LONG _rect_top);
LONG getBmWidth();
LONG getBmHeight();
RECT getCellsToPixels();
void changeBrick(HBITMAP _hBrickBitmap);
LONG& plusX(LONG _delta_x);
LONG& plusY(LONG _delta_y);
};
class MemDC:public Brick {
private:
HBITMAP backupHbitmap;
HDC memory;
public:
MemDC():Brick() {
memory=CreateCompatibleDC(NULL);
backupHbitmap=NULL;
}
MemDC(POINT _pos, HBITMAP _hBitmap):Brick(_pos, _hBitmap) {
memory=CreateCompatibleDC(NULL);
backupHbitmap=(HBITMAP)SelectObject(memory, _hBitmap);
}
MemDC(MemDC& memdc):Brick(memdc.getPos(), memdc.getHbitmap()) {
memory=CreateCompatibleDC(NULL);
backupHbitmap=(HBITMAP)SelectObject(memory, memdc.getHbitmap());
}
~MemDC() {
if(backupHbitmap!=NULL) {
SelectObject(memory, backupHbitmap);
}
if(memory!=NULL) {
DeleteDC(memory);
}
}
void selectObject(HBITMAP _hBitmap) {
changeBrick(_hBitmap);
if(backupHbitmap==NULL) {
backupHbitmap=(HBITMAP)SelectObject(memory, _hBitmap);
}
else {
SelectObject(memory, _hBitmap);
}
}
void set(POINT pos, HBITMAP hBitmap) {
initBrick(pos, hBitmap);
selectObject(hBitmap);
}
BOOL stretchBlt(int x, int y, int width, int height, MemDC& srcMemDC, int srcx, int srcy, int srcwidth, int srcheight, DWORD dwRop=SRCCOPY) {
return StretchBlt(memory, x, y, width, height, srcMemDC.getMemDC(), srcx, srcy, srcwidth, srcheight, dwRop);
}
BOOL transparentBlt(int x, int y, int width, int height, MemDC& srcMemDC, int srcx, int srcy, int srcwidth, int srcheight, UINT crTransparent=0xffffff) {
return TransparentBlt(memory, x, y, width, height, srcMemDC.getMemDC(), srcx, srcy, srcwidth, srcheight, crTransparent);
}
HDC getMemDC() {
return memory;
}
HDC getMemDC() const {
return memory;
}
};
VOID ConfirmDisplay(const MemDC& backgroundMem, RECT& area) {
//_stprintf(tmbuffer, TEXT("%d %d"), area.right, area.left);//test
//MessageBox(ghWnd, tmbuffer, NULL, MB_OK);//test
//int height=LINES*MOVECELL;
//int width=COLUMNS*MOVECELL;
COLORREF* line=new COLORREF[area.right-area.left+1];
BOOL isWhite=FALSE;
UINT lineidx=area.bottom;
//MemDC tmpMemDC;
//tmpMemDC.selectObject(background);
HDC tmpMemDC=CreateCompatibleDC(NULL);
HBITMAP hBackupBitmap=(HBITMAP)SelectObject(tmpMemDC, background);
BITMAP bitInfo;
GetObject(background, sizeof(BITMAP), &bitInfo);
for(int y=area.bottom;y>=area.top;y--) {
UINT column=0;
for(int k=0;k<(area.right-area.left+1);k++) {
line[k]=0x00ffffff;
}
isWhite=FALSE;
for(int x=area.left;x<=area.right;x++) {
COLORREF hdcpixel=GetPixel(backgroundMem.getMemDC(), x, y);
if(hdcpixel==0xffffff) {
isWhite=TRUE;
}
line[column]=hdcpixel;
column++;
}
if(isWhite) {
for(int k=0;k<(area.right-area.left+1);k++) {
//MessageBox(ghWnd, TEXT("white"), NULL, MB_OK);//test
BOOL ff=SetPixel(tmpMemDC, area.left+k, lineidx, line[k]);
}
lineidx--;
}
else {
//MessageBox(ghWnd, TEXT("no white"), NULL, MB_OK);//test
score+=9;
_stprintf(board, TEXT("Score : %d"), score);
}
}
for(int y=area.bottom;y>=area.top;y--) {//test block
for(int x=area.left;x<=area.right;x++) {
COLORREF tmcolor=GetPixel(tmpMemDC, x, y);
if(tmcolor!=0xffffff) {
_stprintf(tmbuffer, TEXT("%d not white %x %d"), x, tmcolor, area.right);
//MessageBox(ghWnd, tmbuffer, NULL, MB_OK);
break;
}
}
}
HBRUSH hBrush=CreateSolidBrush(0xffffff);
HBRUSH hBackupBrush=(HBRUSH)SelectObject(backgroundMem.getMemDC(), hBrush);
HPEN hPen=CreatePen(PS_SOLID, 0, 0xffffff);
HPEN hBackupPen=(HPEN)SelectObject(backgroundMem.getMemDC(), hPen);
Rectangle(backgroundMem.getMemDC(), area.left, area.top, area.right, area.bottom);
BitBlt(backgroundMem.getMemDC(), 0, 0, bitInfo.bmWidth, bitInfo.bmHeight, tmpMemDC, 0, 0, SRCCOPY);
SelectObject(backgroundMem.getMemDC(), hBackupBrush);
DeleteObject(hBrush);
SelectObject(backgroundMem.getMemDC(), hBackupPen);
DeleteObject(hPen);
SelectObject(tmpMemDC, hBackupBitmap);
DeleteDC(tmpMemDC);
delete[] line;
}
MemDC fullDC;
LRESULT CALLBACK WinProc(HWND hwnd, UINE message, WPARAM wparam, LPARAM lparam) {
switc(message) {
case WM_TIMER:
TransparentBlt(fullDC.getMemDC(), brickMem.getFirstX()*MOVECELL, brickMem.getFirstY()*MOVECELL, brickMem.getBmWidth(), brickMem.getBmHeight(), brickMem.getMemDC(), 0, 0, brickMem.getBmWidth(), brickMem.getBmHeight(), 0xffffff);
ConfirmDisplay(fullDC, inner_wall);
}
return DefWindowProc(hwnd, message, wparam, lparam);
}
ConfirmDisplay에서 원래의 화면이었던 fullDC를 갱신해야 합니다. 저거 테트리스거든요. 그러니까 한 줄 다 채워질 경우 그 한 줄은 지우고 나머지들을 그 아래줄에 연이어 채워야 한다는 것이죠. 그런데 계속 화면이 갱신되지 않습니다. 그런데 레퍼런스를 사용하지 않으면 정상적으로 되요. 대신 시간이 많이 걸리죠. 그래서 레퍼런스를 사용하려 했는데, 화면 갱신이 정상적으로 안되는 문제가 어디서 발생하는 것인지 모르겠습니다.
댓글 달기