순환 종속성을 피하기 위해 신호/슬롯을 사용합니까?
-
21-12-2019 - |
문제
메인이 여러 하위 그래픽 항목을 생성하는 그래픽 항목(부모)을 생성하는 멋지지 않은 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()
대신에 할 수 있는 일은 다음과 같습니다:
- 선언하다
doSomething()
슬롯으로 - Bar가 신호를 내보내도록 합니다.
somethingHappened()
- 하위 항목을 생성할 때 하위 항목을 연결하세요.
somethingHappened()
부모에게 신호를 보내다doSomething()
슬롯
이것은 종속성 주입의 예이며, 이를 통해 나중에 변경하지 않고도 상위 클래스를 다른 클래스로 교체할 수 있습니다. Bar
조금도.
제휴하지 않습니다 StackOverflow