2012-12-07 4 views
3

나는 일련의 명령을 취하는 프로그램을 만들었다. square 150 160 그리고 창에 몇 가지 모양을 그립니다. 임의의 개의 명령에 대해이 작업을 수행하려고합니다. 그래서 루프를 사용합니다. 것은 모양을 만들고 창에 붙이는 명령이 루프 일 때 일 때 루프가 끝나면 내용이 없습니다. 에는 아무 것도 첨부되어 있지 않습니다. 나는 그 블록 (범위)의 끝 부분 이후에 루프가 내부 모양을 만드는 호출이 파괴되기 때문에 이런 일이 발생할 것이라고 생각합니다.어떻게 C++에서 루프의 창에 도형을 만들고 연결할 수 있습니까?

이 문제를 어떻게 극복 할 수 있습니까?

#include "Simple_window.h" 
#include "Graph.h" 
#include <string.h> 
#include "Point.h" 
#include "Window.h" 
#include "GUI.h" 

string shape[100],color[100],name; 
int x[100],y[100],side[100],width[100],height[100],radius[100],i=0; 

int main() 
{ 

    using namespace std; 
    using namespace Graph_lib; 

    //---------------Reading Input------------------------------------------------// 
    while ((cin >> name)&&(i<=3)) 
    { 

    if (name.compare("square") == 0){ 
    i++; 

    shape[i]="square"; 
    cin >> x[i] >> y[i] >> side[i] >> color[i]; 
    }else if (name.compare("circle") == 0){ 
    i++; 

    shape[i]="circle"; 
    cin >> x[i] >> y[i] >> radius[i] >> color[i]; 
    }else if (name.compare("rectangle") == 0){ 
    i++; 

    shape[i]="rectangle"; 
    cin >> x[i] >> y[i] >> width[i] >> height[i] >> color[i] ; 
    } 


} 

Simple_window win(Point(100,100), 900, 600, "test"); 

for(i=1;i<=3;i++){ 

if (shape[i].compare("circle") == 0){ 
    Circle r(Point(x[i],y[i]),radius[i]); 
    win.attach(r); 
    cout << "circle"; 


}else if(shape[i].compare("rectangle")==0){ 
    Rectangle l(Point(x[i],y[i]),width[i],height[i]); 
    win.attach(l); 
    cout << "rect"; 

}else if(shape[i].compare("square")==0){ 
    Rectangle k(Point(x[i],y[i]),side[i],side[i]); 
    win.attach(k); 
    cout << "square"; 
} 

} 

win.wait_for_button(); 
return 0; 
} 
+0

Stroustrup의 "Principle and Practice Using C++"를 읽으십니까? 나는 똑같은 문제에 부딪 혔고 책에서 연습 전에 설명되지 않았습니다. 지금 당장은 혼란스러워. – diversario

답변

1

귀하의 변수가 범위 밖으로 갈 때 파괴되는 것을 방지하기 위해 동적으로 생성 할 필요가 :

여기 내 코드입니다.

Circle *r = new Circle(Point(x[i],y[i]),radius[i]); 
win.attach(*r); 
+0

난 그냥 시도하고 지금 이것을 얻을 : : ask3.cpp : 49 : 50 : 오류 : 'Graph_lib :: Circle *'에서 'Graph_lib :: Circle'이 아닌 스칼라 유형으로 변환이 요청 됨 ask3.cpp : 51 : 65 : 오류 : 'Graph_lib :: Rectangle *'에서 비 스칼라 유형 'Graph_lib :: Rectangle'으로 변환이 요청되었습니다. ask3.cpp : 53 : 62 : 오류 : 'Graph_lib :: Rectangle *'에서 비 스칼라 유형으로 변환 'Graph_lib :: Rectangle'requested – Daimba

+0

죄송합니다 - 포인터를 올바르게 사용하도록 코드를 수정했습니다. – stark

0

그것은, 어떤 사본이 함수가 호출되는 경우 개체의 사용은 금지되며, 그 범위가 실행될 때 참으로 추가 된 객체가 파괴됩니다 참조로 인수를 통과 할 때 첨부 기능, 작성 방법에 따라 달라집니다 밖으로 즉. for 루프 블록
이 경우 window.attach() 함수를 다시 작성하거나 포인터를 사용하고 "new"문을 사용하여 객체를 만들어야합니다. new를 사용할 때 더 이상 필요하지 않은 객체를 삭제하려면 delete를 사용해야합니다! 아마 최고의 당신이 이것을 몰랐어요 경우

Circle r = new Circle(Point(x[i],y[i]),radius[i]); 
win.attach(*r) 

, 당신이 정말로 FLTK 데모에서는 C++

0

에서 포인터에 대한 자세한 내용은해야 ... 창 클래스의 소멸자에 첨부 된 객체의 파괴를 추가 디렉토리에는 맞춤형 위젯을 만드는 방법에 대한 예제가 있습니다. 그것은 당신이하고 싶은 일을하는 방법입니다. 모든 모양 (위젯 클래스의 하위 클래스)을 만들면 fltk::Group (예 : fltk::Window)에 쉽게 넣을 수 있습니다.

내가 말하는 별 모양의 위젯에 대한 데모입니다. 나는 그 파일의 이름을 정확히 기억하지 못한다.

업데이트 : 더 쉬운 방법은 단순히 창에 draw() 메서드를 재정의하고 모든 도형을 페인트하는 것입니다. 매우 쉽게 할 수 있습니다. 다음을 읽어보십시오. http://www.fltk.org/doc-1.3/drawing.html.