3

たとえば、一連のコマンドを使用 square 150 160 してウィンドウにいくつかの図形を描画するプログラムを作成しました。任意の数のコマンドに対して実行したい。そのため、ループを使用してこれを行います。問題は、シェイプを作成してウィンドウにアタッチするコマンドがループしている場合、最後のウィンドウにはコンテンツがありません。たとえば、何もアタッチされていません。これは、ループ内で形状を作成する呼び出しがブロック (スコープ) の終了後に破棄されるために発生する可能性があると思います。

どうすればこの問題を克服できますか?

これが私のコードです:

#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;
}
4

3 に答える 3

1

変数がスコープ外になったときに破棄されないように、変数を動的に作成する必要があります。

Circle *r = new Circle(Point(x[i],y[i]),radius[i]);
win.attach(*r);
于 2012-12-07T20:46:52.813 に答える
0

FLTK デモ ディレクトリには、カスタム形状のウィジェットを作成する方法の例があります。それが私見です。あなたがやりたいことをする方法です。すべての形状 (Widget クラスのサブクラス) を作成したら、それらを a fltk::Group(fltk::Window例として a) に簡単に配置できます。

私が話しているデモは、星型のウィジェットに関するものです。ファイルの名前を正確に覚えていません。

更新:より簡単な方法は、ウィンドウの draw() メソッドを単純にオーバーライドし、すべての形状を単純にペイントすることです...これは非常に簡単です - 以下を読んでください: http://www.fltk.org/doc-1.3 /drawing.html .

于 2012-12-23T13:51:47.990 に答える
0

アタッチ関数がどのように記述されているかによって異なります。参照によって引数を渡す場合、関数が呼び出されたときにオブジェクトのコピーは作成されず、実際、追加されたオブジェクトはスコープがなくなると破棄されます。for ループ ブロック。
この場合、window.attach() 関数を書き直すか、ポインタと「new」ステートメントを使用してオブジェクトを作成する必要があります。new を使用する場合は、不要になったオブジェクトを破棄するために delete も使用する必要があります。おそらく、ウィンドウ クラスのデストラクタにアタッチされたオブジェクトの破棄を追加するのが最善です...

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

これを知らなかった場合は、C++ のポインターについてもっと学ぶ必要があります。

于 2012-12-07T20:56:19.553 に答える