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

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

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

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

Q&A

0回答

403閲覧

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

dem0nmichik0

総合スコア37

C++Builder

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

0グッド

0クリップ

投稿2022/04/04 13:51

困っていること

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

エラー内容

C++

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

試したこと

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

C++

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

GUIフォーム

イメージ説明

ソース

「Unit1.cpp」

C++

1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5 6#include "Unit1.h" 7//--------------------------------------------------------------------------- 8#pragma package(smart_init) 9#pragma resource "*.dfm" 10TForm1 *Form1; 11//--------------------------------------------------------------------------- 12__fastcall TForm1::TForm1(TComponent* Owner) 13 : TForm(Owner) 14{ 15} 16//--------------------------------------------------------------------------- 17void __fastcall TForm1::OnMakeButton(TObject *Sender) 18{ 19 TButton* button1 = new TButton(this); 20 button1->Parent = Form1; 21 button1->Left = 100; 22 button1->Top = 100; 23 button1->Width = 100; 24 button1->Height = 40; 25 button1->Caption = _TEXT("BUTTON1"); 26} 27//--------------------------------------------------------------------------- 28void __fastcall TForm1::OnMakeButtons(TObject *Sender) 29{ 30 // 1つ目のボタン 31 TButton* button1 = new TButton(this); 32 button1->Parent = Form1; 33 button1->Left = 100; 34 button1->Top = 100; 35 button1->Width = 100; 36 button1->Height = 40; 37 button1->Caption= _TEXT("BUTTON1"); 38 // 2つ目のボタン 39 // ↓これだとコピーではなく,生成 40// TButton* button2 = new TButton(this); 41 TButton* button2 = (TButton*)button1->clone(); 42 button2->Parent = Form1; 43 button2->Left = (button1->Left + button1->Width + 50); 44 button2->Top = 100; 45 button2->Width = 100; 46 button2->Height = 40; 47 button2->Caption= _TEXT("BUTTON2"); 48 49} 50 51Cloneable* TForm1::clone() 52{ 53 TForm1* pClone = new TForm1(this); 54 55 return pClone; 56} 57 58/* 59Cloneable* TButton::clone() 60{ 61 TButton* pClone = new TButton(this); 62 63 return pClone; 64} 65*/ 66//---------------------------------------------------------------------------

「Unit1.h」

C++

1//--------------------------------------------------------------------------- 2 3#ifndef Unit1H 4#define Unit1H 5//--------------------------------------------------------------------------- 6#include <System.Classes.hpp> 7#include <Vcl.Controls.hpp> 8#include <Vcl.StdCtrls.hpp> 9#include <Vcl.Forms.hpp> 10//--------------------------------------------------------------------------- 11// Cloneableインターフェース 12class Cloneable 13{ 14public: 15 // 純粋仮想メソッド(継承先で実装すべきメソッド) 16 virtual Cloneable* clone() = 0; 17}; 18/* 19class TButton : public Cloneable 20{ 21public: // ユーザー宣言 22 // クローン 23 Cloneable* clone(); 24}; 25*/ 26class TForm1 : public TForm, public Cloneable 27{ 28__published: // IDE で管理されるコンポーネント 29 TButton *Button1; 30 TButton *Button2; 31 void __fastcall OnMakeButton(TObject *Sender); 32 void __fastcall OnMakeButtons(TObject *Sender); 33private: // ユーザー宣言 34public: // ユーザー宣言 35 // コンストラクタ 36 __fastcall TForm1(TComponent* Owner); 37 // クローン 38 Cloneable* clone(); 39}; 40//--------------------------------------------------------------------------- 41extern PACKAGE TForm1 *Form1; 42//--------------------------------------------------------------------------- 43#endif

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 開発環境にはビジュアルデザイナーなどと呼ばれるものが用意されていて、この場合は実際のオブジェクトをコピーするのではなく、開発時に作った雛形をもとにオブジェクトを生成することになりますが、これを広い意味でのプロトタイプパターンの変形とみなす考え方もある気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問