質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

受付中

prototypeデザインパターンをGUIアプリで実装できなくて困っています

dem0nmichik0
dem0nmichik0

総合スコア37

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

0回答

0リアクション

0クリップ

216閲覧

投稿2022/04/04 13:51

困っていること

増補改訂版Java言語で学ぶデザインパターン入門独習デザインパターンC++を参考にデザインパターンを勉強しています。プロトタイプのパターンを学び,「インスタンスの生成が楽になる」ということが分かりました。プロトタイプパターンを利用して1つ生成したボタンをコピーできるか試しているのですが,実装方法が分からず困っています。どなたがご教授お願いいたします。

エラー内容

C++

[bcc32c エラー] Unit1.cpp(41): no member named 'clone' in 'Vcl::Stdctrls::TButton'

試したこと

Vcl::Stdctrls::TButtonにはclone()メソッドが定義されていないから上記エラーが出ていると思い,TButtonクラスにCloneableインターフェースを継承させました。Unit1.hのコメントされているTButtonクラスを実装してみると,下記エラーが出てきて解決方法が分からず,困っています。

C++

[bcc32c エラー] Unit1.h(29): reference to 'TButton' is ambiguous Unit1.h(19): candidate found by name lookup is 'TButton' Vcl.StdCtrls.hpp(1198): candidate found by name lookup is 'Vcl::Stdctrls::TButton'

GUIフォーム

イメージ説明

ソース

「Unit1.cpp」

C++

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::OnMakeButton(TObject *Sender) { TButton* button1 = new TButton(this); button1->Parent = Form1; button1->Left = 100; button1->Top = 100; button1->Width = 100; button1->Height = 40; button1->Caption = _TEXT("BUTTON1"); } //--------------------------------------------------------------------------- void __fastcall TForm1::OnMakeButtons(TObject *Sender) { // 1つ目のボタン TButton* button1 = new TButton(this); button1->Parent = Form1; button1->Left = 100; button1->Top = 100; button1->Width = 100; button1->Height = 40; button1->Caption= _TEXT("BUTTON1"); // 2つ目のボタン // ↓これだとコピーではなく,生成 // TButton* button2 = new TButton(this); TButton* button2 = (TButton*)button1->clone(); button2->Parent = Form1; button2->Left = (button1->Left + button1->Width + 50); button2->Top = 100; button2->Width = 100; button2->Height = 40; button2->Caption= _TEXT("BUTTON2"); } Cloneable* TForm1::clone() { TForm1* pClone = new TForm1(this); return pClone; } /* Cloneable* TButton::clone() { TButton* pClone = new TButton(this); return pClone; } */ //---------------------------------------------------------------------------

「Unit1.h」

C++

//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> //--------------------------------------------------------------------------- // Cloneableインターフェース class Cloneable { public: // 純粋仮想メソッド(継承先で実装すべきメソッド) virtual Cloneable* clone() = 0; }; /* class TButton : public Cloneable { public: // ユーザー宣言 // クローン Cloneable* clone(); }; */ class TForm1 : public TForm, public Cloneable { __published: // IDE で管理されるコンポーネント TButton *Button1; TButton *Button2; void __fastcall OnMakeButton(TObject *Sender); void __fastcall OnMakeButtons(TObject *Sender); private: // ユーザー宣言 public: // ユーザー宣言 // コンストラクタ __fastcall TForm1(TComponent* Owner); // クローン Cloneable* clone(); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif

開発環境
OS:Windows64bit
IDE:Embarcadero C++Builder 10.3.3

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2022/04/10 01:41

プロトタイプパターンはあまり C++ 向きじゃない気が…。というか、元のクラス設計がプロトタイプパターンに対応してないとどうしようもないと思います。
dem0nmichik0

2022/04/11 09:26

hoshi-takanori様,質問への追記・修正依頼,ありがとうございます。 >プロトタイプパターンはあまり C++ 向きじゃない気が…。 そうなんですね。C++もオブジェクト指向だから,可能だと思っていたのですが,やはりJava向きなのでしょうか?やりたいこととしては,Builderパターンでインスタンスを組み立てた後,同じインスタンスが複数あるので,コピーできないかなと思い,試しにTShape型のButtonをプロトタイプパターンで複製したかったのですが。。。不可能なのでしょうか?
hoshi-takanori

2022/04/11 19:45 編集

自分の印象では、プロトタイプパターンは Smalltalk などの動的型付け言語に向いていて、C++ や Java などの静的型付けの言語にはあまりマッチしないという印象です。頑張って実装すれば不可能ではないかも知れませんが、clone メソッドが用意されてない時点で C++Builder ではあまり推奨してないのだと思います。 > Builderパターンでインスタンスを組み立てた後,同じインスタンスが複数あるので,コピーできないかなと 既に作ったオブジェクトがあり、似たようなものがほしいからそれをコピーしたい、という発想は分かりますが、実際には、すでに作られたオブジェクトをコピーする場合、何をどこまでコピーすべきか (できるか) という問題があって、そんなことまでコピーするとは思わなかったとか、どうしてこれはコピーしてくれないのとか、一部のプロパティがコピーじゃなくて共有されててコピー後に片方を変えたらもう片方も変わっちゃった、などの予期せぬことが起こりがち、という印象があります。 「Builderパターンでインスタンスを組み立て」るなら、その組み立て処理を関数か何かにして、変えたい部分をパラメータで渡すようにすれば、その辺の曖昧さがなくなります。また、多くの GUI 開発環境にはビジュアルデザイナーなどと呼ばれるものが用意されていて、この場合は実際のオブジェクトをコピーするのではなく、開発時に作った雛形をもとにオブジェクトを生成することになりますが、これを広い意味でのプロトタイプパターンの変形とみなす考え方もある気がします。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。