メンバ関数の呼び出し方法はどちらがよい?

[戻る]
独しん 2006/05/22(月) 02:32:23
はじめまして、C++を始めて間もない初心者です。

Windows2000、VisualC++6.0でコンソールアプリを作りながら学んでおります。

関数になるべく必要のないアクセス権は持たせないほうが良いと
いろいろ書いてあるのですが、他のクラスのメンバ関数を呼び出すとき
呼び出し方に良い悪いあるのですか。

一つ目
class ratus
{public:void close(void);
};

class mice
{public:void open(void);
        ratus z;
};

void mice::open(void)
{z.close();}

void ratus::close(void)
{std::cout<<"開通";}

void main()
{mice sin;
sin.open();}

独しん 2006/05/22(月) 02:35:17
すいません。送信押してしまいました。

二つ目は
class ratus
{public:void close(void);
} z;

class mice
{public:void open(void);
};

void mice::open(void)
{
z.close();}

void ratus::close(void)
{std::cout<<"開通";}

void main()
{mice sin;
sin.open();}
です。

シャノン 2006/05/22(月) 06:44:55
違うのは z の宣言位置だけのようですが…

まず、前提として、コードは確かにこのように書かれていますか?
Java や C# ライクに、メンバの宣言と定義を同時に行うのは、C++ では一般的なスタイ
ルではありません。C++ では、(テンプレートを使わない限り)宣言をヘッダに書き、
定義を cpp ファイルに書くのが一般的です。
もちろん、そうでない方法でも通用します。今回のように宣言と定義を同時に行っても
間違いではありません。
で、今回はこのように、かつ、これは cpp ファイルに書かれているということでよろし
いですか?

さて、どちらがいいかということですが…コードの意味が等価でないため、単純に比較
できません。
第一案では、mice のメンバ変数として ratus を持っていますから、main の中で mice 
のインスタンスが生成された時に z が生成されます。
第二案では、z はグローバル変数なので、1つしか存在しません。mice のインスタンス
をいくつ作っても、すべての mice は同じ z を共有します。
この2つの案はそもそも仕様が違うため、まずは仕様を明確にしないと、どちらが望ま
しいのか決めることはできません。

ただし、どちらの仕様だとしても、個人的にはどちらの案も望ましいとは言えないと思
います。

PATIO 2006/05/22(月) 10:44:04
例としてあげるにしてももうちょっと意義がわかるような例にした方が
伝わりやすいと思いますよ。

元々やりたい事がきちんと提示されていない(シャノンさんが言われている仕様の事です)
ので何をやりたくて例を提示しているのかがさっぱりわかりません。
特に今回みたいな抽象的な質問に関しては例の挙げ方がうまくないと内容が伝わりません。
具体的にどういうことがやりたいのかきちんと解説した方が良いと思いますよ。

古いスレッドには追加発言できません。