문제

메인이 여러 하위 그래픽 항목을 생성하는 그래픽 항목(부모)을 생성하는 멋지지 않은 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();
    ...
}
도움이 되었습니까?

해결책

예, 그것이 바로 신호와 슬롯의 용도입니다.

지금 당장 당신은 Bar::someFunction() 어느 전화 Foo::doSomething()

대신에 할 수 있는 일은 다음과 같습니다:

  1. 선언하다 doSomething() 슬롯으로
  2. Bar가 신호를 내보내도록 합니다. somethingHappened()
  3. 하위 항목을 생성할 때 하위 항목을 연결하세요. somethingHappened() 부모에게 신호를 보내다 doSomething() 슬롯

이것은 종속성 주입의 예이며, 이를 통해 나중에 변경하지 않고도 상위 클래스를 다른 클래스로 교체할 수 있습니다. Bar 조금도.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top