C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: クラスの構成について


(過去ログ 59 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■33610 / inTopicNo.1)  クラスの構成について
  
□投稿者/ 七篠 (22回)-(2009/03/05(Thu) 14:04:27)

分類:[C/C++] 

こんにちは

現在、画像の描画を管理するクラスを作っています。
2D画像関係は "Image_Draw" など、関係する関数の頭に "Image" を
付け、3D関係の関数には "Mesh_Draw" など、頭に関係する名前を付けていました。
この方法だと入力補完の候補が多くなってうるさいので

Image.Draw()

などと使用できるようにしたいと思いました。
思いついた方法は、元のグラフィッククラスのポインタを持った
Imageクラスなどを作り、元のグラフィッククラスのフレンドクラスとして
指定。 グラフィッククラスの全てを使用できるようにし、
関連関数を実装。 そのクラスをグラフィッククラスのメンバに
すると言う方法です。
しかし、これでは参照の循環が起きてしまいます。

この問題の解決策、あるいは他にいい方法をご存知の方。
よろしければアドバイスをいただけると幸いです。
引用返信 編集キー/
■33612 / inTopicNo.2)  Re[1]: クラスの構成について
□投稿者/ .SHO (712回)-(2009/03/05(Thu) 14:07:23)
No33610 (七篠 さん) に返信

> 2D画像関係は "Image_Draw" など、関係する関数の頭に "Image" を
> 付け、3D関係の関数には "Mesh_Draw" など、頭に関係する名前を付けていました。

この名前を変更してはダメなんですか?
引用返信 編集キー/
■33621 / inTopicNo.3)  Re[2]: クラスの構成について
□投稿者/ 七篠 (23回)-(2009/03/05(Thu) 15:05:01)
お返事ありがとうございます。

>>2D画像関係は "Image_Draw" など、関係する関数の頭に "Image" を
>>付け、3D関係の関数には "Mesh_Draw" など、頭に関係する名前を付けていました。
>
> この名前を変更してはダメなんですか?

特に駄目ということではないですが、どのように変更するのでしょうか?
引用返信 編集キー/
■33623 / inTopicNo.4)  Re[3]: クラスの構成について
□投稿者/ .SHO (716回)-(2009/03/05(Thu) 15:07:15)
No33621 (七篠 さん) に返信

> 特に駄目ということではないですが、どのように変更するのでしょうか?

あっ、自作クラスに「Imageなんとか」っていうのが沢山あるってことでしたか。。
引用返信 編集キー/
■33624 / inTopicNo.5)  Re[4]: クラスの構成について
□投稿者/ επιστημη (1796回)-(2009/03/05(Thu) 16:26:47)
επιστημη さんの Web サイト
> この問題の解決策、あるいは他にいい方法をご存知の方。
> よろしければアドバイスをいただけると幸いです。

問題はどれですか?

> 2D画像関係は "Image_Draw" など、関係する関数の頭に "Image" を
> 付け、3D関係の関数には "Mesh_Draw" など、頭に関係する名前を付けていました。

これ?

> この方法だと入力補完の候補が多くなってうるさいので

これ?

> しかし、これでは参照の循環が起きてしまいます。

それともこれ?

引用返信 編集キー/
■33625 / inTopicNo.6)  Re[4]: クラスの構成について
□投稿者/ 七篠 (24回)-(2009/03/05(Thu) 16:31:03)
No33623 (.SHO さん) に返信
> ■No33621 (七篠 さん) に返信
>
>>特に駄目ということではないですが、どのように変更するのでしょうか?
>
> あっ、自作クラスに「Imageなんとか」っていうのが沢山あるってことでしたか。。

その通りです。 "Imgage_Load", "Imgage_Draw" などを "Image.Load", "Image.Draw"
(変数名が単純な "Load", "Draw" になる)とアクセスできるようにしたいのです。
入力補完ではこの "Image" 絡みのものが一つにまとめられるということです。
引用返信 編集キー/
■33627 / inTopicNo.7)  Re[5]: クラスの構成について
□投稿者/ 七篠 (25回)-(2009/03/05(Thu) 16:36:45)
No33624 (επιστημη さん) に返信
お返事ありがとうございます。

> 問題はどれですか?

>>しかし、これでは参照の循環が起きてしまいます。

基本はこれのつもりです。入力補完の候補を少なくする方法を
考えたけど、参照に問題があったという状態です。
ただ、「参照の循環以前に構造に問題がある」とか
「他にもっと良い構造がある」などの意見があったら
お聞きしたいということです。
引用返信 編集キー/
■33628 / inTopicNo.8)  Re[6]: クラスの構成について
□投稿者/ επιστημη (1797回)-(2009/03/05(Thu) 16:44:12)
επιστημη さんの Web サイト
んー...僕なら名前空間使うかなー...

namespace Image {
  void Draw();
  ...
}

あるいは struct 内のstatic関数か

struct Iamge {
  staic void Draw();
  ...
};

# 呼び出し側では いずれも Iamge::Draw()

引用返信 編集キー/
■33634 / inTopicNo.9)  Re[7]: クラスの構成について
□投稿者/ 七篠 (26回)-(2009/03/05(Thu) 18:20:23)
No33628 (επιστημη さん) に返信
お返事ありがとうございます。

すいません、説明不足でした。
"Image" などはインスタンス化したグラフィッククラスから
アクセスしたいのです。(以下のような感じです

Graphic g;
g.Image.Draw();

名前空間の方は「予期しないトークン〜」というエラーが出て
しまったのですが、構造体の方は以下のようにしたら
class G
{
public:
int hoge;

G()
{
hoge = 7;
Image.Init(this);
}

void Func1()
{
cout << "Func1" << endl;
}

struct ImageMng
{
G* pG;
public:

void Init(G* pg)
{
pG = pg;
}

void Func0()
{
pG->Func1();
cout << pG->hoge << endl;
}
};

ImageMng Image;
};

このようにアクセスできました。 ImageMng 内で G のメンバも問題なく使えます。

G g;
g.Image.Func0();

ただ、この構造体を別のヘッダで定義しようと外にだしてみたのですが、
G 「認識できない型」としてエラーが出てしまいました。
これはあきらめるしかないのでしょうか?

引用返信 編集キー/
■33649 / inTopicNo.10)  Re[8]: クラスの構成について
□投稿者/ επιστημη (1798回)-(2009/03/05(Thu) 22:14:01)
επιστημη さんの Web サイト
> ただ、この構造体を別のヘッダで定義しようと外にだしてみたのですが、
> G 「認識できない型」としてエラーが出てしまいました。
> これはあきらめるしかないのでしょうか?

コード見ないとなんともいえません。

引用返信 編集キー/
■33660 / inTopicNo.11)  Re[9]: クラスの構成について
□投稿者/ nori (54回)-(2009/03/06(Fri) 12:21:47)
2009/03/06(Fri) 12:32:41 編集(投稿者)
>ただ、この構造体を別のヘッダで定義しようと外にだしてみたのですが、
>G 「認識できない型」としてエラーが出てしまいました。
>これはあきらめるしかないのでしょうか?

struct ImageMngの上にclass G;追記し、実装部とヘッダー部を別ければよいと思う

# コードを登録するときは、できれば『図表モード』で投稿して下さい。

引用返信 編集キー/
■33671 / inTopicNo.12)  Re[10]: クラスの構成について
□投稿者/ επιστημη (1800回)-(2009/03/06(Fri) 14:42:17)
επιστημη さんの Web サイト
> struct ImageMngの上にclass G;追記し、実装部とヘッダー部を別ければよいと思う

あ、ソレのこと?

--- ImageMng.h ---
#ifndef IMAGEMNG_H__
#define IMAGEMNG_H__

class G;

struct ImageMng {
  G* pG;
public:
  void Init(G* pg) { pG = pg; }
  void Func0() ;
};

#endif


--- ImageMng.cpp ---
#include <iostream>

#include "ImageMng.h"
#include "G.h"

void ImageMng::Func0() {
    pG->Func1();
    std::cout << pG->hoge << std::endl;
}


--- G.h ---
#ifndef G_H__
#define G_H__

#include <iostream>
#include "ImageMng.h"

class G {
public:
  int hoge;

  G() : hoge(7) { Image.Init(this); }
  void Func1() { std::cout << "Func1" << std::endl; }

  ImageMng Image;
};

#endif


--- main.cpp ---
#include "G.h"

int main() {
  G g;
  g.Image.Func0();
}

引用返信 編集キー/
■33688 / inTopicNo.13)  Re[11]: クラスの構成について
□投稿者/ dogatana (42回)-(2009/03/06(Fri) 22:02:46)
解決策ではないのですが、

サンプルコードの
 Func0() が Image_Draw()
 Func1()が Draw()
とすると、

> void ImageMng::Draw() {
> pG->Image_Draw();
> std::cout << pG->hoge << std::endl;
> }

のように、全てのImage_なんとか() に対応する なんとか() を定義することになりますね。
これはこれで手間もかかるし、いっそ、Gのメンバ関数をエディタなりで置換した方が早く、
構造としてもすっきりすると思うのですが。。。

もちろん、手間を惜しむのが趣旨ではないでしょうし、Gを使用している既存コードの問題
もあるのでしょうけれど。


G.Draw() と呼び出したとき、未定義関数であるエラーをトラップでき、かつエラーになった
関数名を取得でき、関数名を変更した関数が定義できれば良いのでしょうね。
Rubyのmethod_missingを定義するみたいに。でもC++ではできませんよね??


引用返信 編集キー/
■33692 / inTopicNo.14)  Re[11]: クラスの構成について
□投稿者/ 七篠 (27回)-(2009/03/07(Sat) 00:32:45)
No33671 (επιστημη さん) に返信
>>επιστημη さん
ありがとうございます。実装を分けることができました。

問題解決しました!
みなさん、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -