1

main が多数の子グラフィック項目を作成するグラフィック項目 (親) を作成する C++ Qt コードの洗練されていないチャンクがあります。子と親はお互いのメソッドを呼び出す必要があります。つまり、親は子に何かをするように指示する必要があります (移動、色の変更など)。両方が互いのメソッドを呼び出すと、見苦しい循環コードが発生し、C2027 エラーを回避するのにイライラするようになります。子と親の間の通信手段としてカスタム シグナル/スロット システムを使用することは意味がありますか? それとも、現在の設計にとどまり、これらの種類のバグを解決しようとするべきでしょうか?

たとえば、次のコード (私の現在の設計) は C2027 を生成します。

メインウィンドウ:

#include "mainwindow.h"
#include "ui_mainwindow.h"

vector<Foo*> FooArray;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    int viewwidth = ui->graphicsView->width();

    ...

    FooArray.push_back(new Foo(5, viewwidth, scene));
    FooArray[0]->loadBars();
}

フー:

#include "Foo.h"  //includes bar.h


vector<int> ActiveList;
vector<Bar*> BarArray;

Foo::Foo(int id, int w, QGraphicsScene* scene)
{
    this->id = id;
    this->width = w;
    this->scene = scene;
}

...

void Foo::loadBars()
{
    ...
    BarArray.resize(nitems);
    BarArray[k] = new Bar(id, k, this);
    BarArray[k]->setPos(...);
    scene->addItem(BarArray[k]);
    ...
}

void Foo::doSomething()
{
    ...
}

バー:

#include "Bar.h"  //forward declares Foo; isn't executed until Foo exists. 

Bar::Bar(int setid, int num, Foo* foo)
{
    this->s = setid;
    this->n = num;
    this->owner = foo;
}

...

void Bar::someFunction()
{   
    ...
    owner->doSomething();
    ...
}
4

1 に答える 1

3

はい、まさにそれがシグナルとスロットの目的です。

現在、Bar::someFunction()どの通話がありますかFoo::doSomething()

代わりにできることは次のとおりです。

  1. doSomething()スロットとして宣言する
  2. バーに信号を発させるsomethingHappened()
  3. 子を作成するときは、somethingHappened()信号を親のdoSomething()スロットに接続します

これは依存性注入の例であり、将来、親クラスをまったく変更することなく別のものに交換できますBar

于 2014-01-09T20:51:08.953 に答える