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

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

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

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3718閲覧

C++で別のクラスで生成したインスタンスの関数を他の複数のクラスで実行する方法

nanananana

総合スコア13

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/12 16:44

編集2021/11/13 05:02

C++、teratailともに初心者です。
以下の問題について回答いただけますと幸いです。
また、こちらの都合で申し訳ございませんが、
ソースコードの一部のみの表示、クラス名等の変更を行っております。

前提・実現したいこと

C++で複数のファイル、クラスを使用してメッセージ表示ダイアログのOPEN、CLOSEを行いたいです。
下記のソースコードに記載のあるDlgクラスのinit関数、show関数をShowクラスで、
close関数をCloseクラスで実行したいです。
別のクラスで生成しているインスタンスの関数を他の複数のクラスで実行したいのが今回の本題です。
引数を使用するのはできないのでその他の方法でお願いいたします。
つたない説明で申し訳ございませんが、ご回答いただけますと幸いです。

発生している問題・エラーメッセージ

Show.cpp:(.test+0x2027):`Dlg::m_dlg`に対する定義されていない参照です Close.cpp:(.test+0xddb):`Dlg::m_dlg`に対する定義されていない参照です

該当のソースコード

Dlg.cpp

cpp

1#include "Dlg.hpp" 2 3bool Dlg::init(void) 4{ 5 // ダイアログの初期設定 6} 7 8bool Dlg::show(void) 9{ 10 // ダイアログのOPEN処理 11} 12 13bool Dlg::close(void) 14{ 15 // ダイアログのCLOSE処理 16}

Dlg.hpp

cpp

1class Dlg 2{ 3 public: 4 bool init(void); 5 bool show(void); 6 bool close(void); 7};

Info.hpp

cpp

1#include "Dlg.hpp" 2 3class Info 4{ 5 public: 6 Dlg m_dlg; 7};

Show.cpp

cpp

1bool Show::dlgshow(void) 2{ 3 Info::m_dlg.init(); 4 Info::m_dlg.show(); 5}

Show.hpp

cpp

1#include "Info.hpp" 2 3class Show 4{ 5 private: 6 bool dlgshow(void); 7};

Close.cpp

cpp

1bool Close::dlgclose(void) 2{ 3 Info::m_dlg.close(); 4}

Close.hpp

#include "Info.hpp" class Close { private: bool dlgclose(void); };

補足情報(FW/ツールのバージョンなど)

G++ (GCC) 4.4.7
Linux(Red Hat 6.10)

###追記
引数の使用は絶対にダメということではないですが、
できれば使いたくなかったので他の方法がもしあればと思い質問しました。
引数、グローバル変数でしか実装できないのでしょうか。
もしないのであればグローバルにするのは一番避けたいので引数を使うしかなさそうですね。

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

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

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

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

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

thkana

2021/11/13 00:28

> ソースコードの一部のみの表示、クラス名等の変更を行っております それ自体はかまいませんが、その部分に「間違い」はないですか? close.cppの bool Show::dlgclose(void) はとても怪しく思えます。 シュリンクした状態でコンパイルをしたら同じエラーが出る(違うエラーは出ない)、という状態になっていればいいのですが。 > 引数を使用するのはできない 引数を使用する、とは引数を「何に」使用する話ですか? 「できない」理由も一応伺いたいです。
BeatStar

2021/11/13 00:39

このコードは間違ってませんか? 間違っていないなら基礎すらできていない気がします。
fana

2021/11/13 01:54

> 引数を使用するのはできない くだらない馬鹿げた縛りプレイに興じる前に基礎を学ぶべき. 正当な理由があるのであれば,何故できないのか?という背景事情などをきっちり説明しないと「じゃあグローバルでやってろよ」っていう自明解が出てくるだけの無価値な話になってしまう.
BeatStar

2021/11/13 05:04

> できれば使いたくなかったので いや、だから『なぜ使いたくなかったのか』も書きましょうよ… たとえば、『C言語でいうプロトタイプ宣言のようなものを崩したくないから』とか、『使い方がわからんから』とか、『課題で、「グローバル変数を使うこと」とあるため』のような制限があるとか。 それぞれで対策が変わってきます。
guest

回答3

0

Infoのインスタンスを引数で与えられないとしたら、グローバル変数を利用することになるかと思いますが、正直おススメしません。

C++

1extern Info* info; // 操作対象のInfoをセットしておく 2 3bool Show::dlgshow(void) 4{ 5 info->m_dlg.init(); 6 info->m_dlg.show(); 7}

投稿2021/11/13 00:16

Serbonis

総合スコア581

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

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

dodox86

2021/11/13 00:24

質問の要望をそのまま汲むと私もこちらのご回答と同様のものしか思い浮かびませんでしたが、CloseとかShowとか動詞がクラス名になっている時点でそもそもの設計方針に何か誤りがあるのでは、と思いました。
guest

0

ベストアンサー

別のクラスで生成しているインスタンスの関数を他の複数のクラスで…

何はともあれ,インスタンスにアクセスする手段が必要となります.
Show はどのダイアログを開くのか?
Close はどのダイアログを閉じるのか?

解決方法の1つは,「ShowやCloseは生まれながらにダイアログのインスタンスを知っている」という形にすることかもしれません.

C++

1//Showの生成時にコンストラクタで対象のダイアログを指定する. 2class Show 3{ 4public: 5 Show( Dlg &rDlg ) : m_rDlg(rDlg) {} 6 bool dlgshow(void){ return ( m_rDlg.init() && m_rDlg.show() ); } 7private: 8 Dlg &m_rDlg; 9}; 10 11//Closeも同様 12class Close 13{ 14public: 15 Close( Dlg &rDlg ) : m_rDlg(rDlg) {} 16 bool dlgclose(void){ return m_rDlg.close(); } 17private: 18 Dlg &m_rDlg; 19};

Show::dlgshow()Close::dlgclose() がprivateだと使いようが無いので,ここではpublicに変えてあります.

コンストラクタ引数を用いることが,謎の「引数を使わない縛り」に見合わないというならば,そこは「m_rDlg をpublicなポインタにでも改変して,誰かが生成後に値を与える」みたいな無意味な改造を施せばよいでしょう.

で,ダイアログのインスタンスはどうやら Info が握っているみたいなので,例えば,ShowやCloseのインスタンスを Info が生成することにでもしてみればどうでしょうか.

C++

1class Info 2{ 3public://自身が持っているm_dlgを操作する手段を生成して返す 4 Show Create_Show(){ return Show(m_dlg); } 5 Close Create_Close(){ return Close(m_dlg); } 6private://m_dlgはprivateにした 7 Dlg m_dlg; 8};

※ こんな実装だと Show や Close と Info の寿命の関係次第では問題があるよね,とかそういう話は出てくるだろうけど,そういうのは置いといて,とりあえずの方向性の話として.

投稿2021/11/15 02:00

fana

総合スコア11656

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

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

fana

2021/11/15 02:04 編集

Show だの Close だのいうクラスがあるのは, コマンドパターン気味のことを考えているのか…? という方向に推測して回答を記した. (元々,こいつらのメソッドがprivateなのは,共通I/F から呼ぶ想定なのかな,とか)
guest

0

m_dlgを使いたいなら、infoのインスタンスを生成する必要があります

#んで、エラーメッセージのとおり、Dlgクラスにはm_dlgってのは存在しません

投稿2021/11/12 23:53

編集2021/11/13 00:00
y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問