私のデザインが原因と思われるさまざまなコンパイラエラーをすべて調べました。すべての答えと修正は理にかなっていますが、1つのことを修正することで別の悪いことが起こるという点に達しました。私のC++デザインパターンをより良く実装するには?
私のC++プロジェクトはますます大きくなってきています。そのため、経験豊富なC++開発者の恩恵を受けるために問題を一般化しようとしています。
私が書いているソフトウェアは、実行時にUIオブジェクトを作成するXMLパーサーです。私は使用したい様々なタイプの容器についてContainerInterface
を設計しました。たとえば、TabWidget
はサブクラスQTabWidget
であり、ContainerInterface
も継承しています。今のところ、それらはAbsoluteWidget
,TreeWidget
およびTabWidget
です。 ContainerInterface
で定義された以下の純粋仮想関数のためにすべて持っ実装:
virtual PushButton* createButton(const QString& label, const QString& define, const QPoint& topLeft, const QSize& size) = 0;
virtual CheckBox* createCheckBox(const QString& label, const QString& define, const QString& header, const QPoint& topLeft, const QSize& size) = 0;
virtual ComboBox* createComboBox(const QString& label, const QString& define, const QString& header, const QPoint& topLeft, const QSize& size) = 0;
virtual Image* createImage(const QString& file, const QString& define, const QPoint& topLeft, const QSize& size) = 0;
virtual Led* createLed(const QString& define, const QString& onColor, const QString& offColor, const QPoint& topLeft, const QSize& size) = 0;
virtual Text* createText(const QString& define, const QString& label, const QPoint& topLeft, const QSize& size) = 0;
だからパーサで、私は例えば、ContainerInterface
を使用することができます。
void XmlReader::readCheckBox(ContainerInterface* container, const QString& header)
{
Q_ASSERT(xml.isStartElement() && xml.name() == "checkbox");
QXmlStreamAttributes attr = xml.attributes();
CheckBox* checkBox = container->createCheckBox(getLabel(attr), getDefine(attr), getHeader(attr, header), getTopLeft(attr), getSize(attr));
m_centralWidget->setUIElement(getDefine(attr), checkBox); //this is why i need a return value anyway
}
これは私のコードと作品の多くを保存しましたいいね
virtual TabWidget* createTabWidget(const QPoint& topLeft, const QSize& size) = 0;
virtual TreeWidget* createTreeWidget(const QStringList& labels, const QPoint& topLeft, const QSize& size) = 0;
をそして今、我々は、私は苦労してる部分に来る:だから私も持っているContainerInterface
をしたいと思いますので、細かいである(ように、これはTabWidget
でcreateTabWidget
の実装が必要になりますし、私はTabwidget
に含まれているTabwidget
を持つことができ、それ自体は別のTabWidget
に含まれています)。私は他の要素(例えばCheckBox
)のために使用したのと同じデザインを使用している場合、これは新しいTabWidget
へのポインタを返します。そう
TabWidget* TabWidget::createTabWidget(const QPoint& topLeft, const QSize& size)
{
return new TabWidget(topLeft, size);
}
は私の本当の苦労デバッグを与えているので、これは、いくつかを提起します質問:
TabWidget::createTabWidget
は可能ですか? (それらなしで、それは正常に構築されます)- 私はコンテナのファイルを含めるでしょうか?循環インターフェースを回避するためにコンテナインターフェース内の
tabwidget.h
? (これは私にexpected class name before '{' token
を与えます) TabWidget
をTreeWidget
に転送する必要がありますか? (これは私にinvalid use of incomplete type
エラーを与えます)
あなたが探しているXMLパーサにはQt( 'QUiLoader')が付いており、実行時に使用することができます。なぜあなたは別のものを書いていますか?完全な例については、[この回答](http://stackoverflow.com/a/19327470/1329652)を参照してください。 –
手動で作成されたクラス固有のファクトリメソッドがたくさんあるようです。それらは不要です。 'QMetaObject'機構を利用して、与えられた' QObject'型のクラスコンストラクタ引数を自動的に決定し、それらを自動的にXMLにマップすることができます。 –
UIオブジェクトを作成するためにxmlを解析する目的を誰もが推測できるのは間違いですが、これには多くの回答があります。私は一緒に行く:それは私の仕事なので。 – tobilocker