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

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

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

Re[3]: スコープ演算子について


(過去ログ 66 を表示中)

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

■38659 / inTopicNo.1)  スコープ演算子について
  
□投稿者/ barbapapa (1回)-(2009/07/22(Wed) 22:28:16)

分類:[C/C++] 

お世話になります。

class A
{
int const nA;
void Set( const int nset){ nA = nset}
int Get(void){ return nA }
}
class B
{
.......
class A cA;
void BB;
}
class C
{
class A cA;
void CC;
}
という感じの3つのクラスがあった場合、以下2ケースのようなコードを良く見ます。
B::BB
{
cA.Set(1);// ケース1)
A::Set(1);// ケース2)
}

C::CC
{
cA.Set(1);// ケース1)
A::Set(1);// ケース2)
}
以下認識なのですがOKでしょうか?
ケース1)の場合は、クラスC内とB内でのA::nAの値が変わる。
ケース2)の場合は、クラスC内とB内でのA::nAの値が等しい。
オブジェクトが確実に1つで、複数のクラスからアクセスする場合は、ケース2)でOK。
スコープ演算子で調べたのですが、namespaceや、同一ファイル内でのスコープの話ばかりヒットしてしまい、
確信が持てませんでした。

すいませんが教えて下さい。

引用返信 編集キー/
■38660 / inTopicNo.2)  Re[1]: スコープ演算子について
□投稿者/ 774RR (369回)-(2009/07/22(Wed) 22:37:33)
なんだかソースコードが不正確で何が書いてあるのかわからない。
とりあえず最低限コンパイルに通るコードを「図表モード」で書いて欲しい。

non-static な const メンバ変数はメンバコンストラクタで初期化しなきゃならんよ。
それがわかっていれば提示コードが変すぎるの自分で理解できると思うが。
引用返信 編集キー/
■38661 / inTopicNo.3)  Re[1]: スコープ演算子について
□投稿者/ επιστημη (2065回)-(2009/07/22(Wed) 22:46:36)
επιστημη さんの Web サイト
> class A
> {
>   int const nA;
>   void Set( const int nset){ nA = nset}
>   int Get(void){ return nA }
> }
> class B
> {
> .......
>   class A cA;
>   void BB;
> }
> class C
> {
>   class A cA;
>   void CC;
> }
> という感じの3つのクラスがあった場合、以下2ケースのようなコードを良く見ます。

良く見ませんけど。コンパイル・エラーだし。

> ケース1)の場合は、クラスC内とB内でのA::nAの値が変わる。

ですね。

> ケース2)の場合は、クラスC内とB内でのA::nAの値が等しい。

違います。
Set対象となるインスタンスが指定されてないのでコンパイル・エラーです。

引用返信 編集キー/
■38668 / inTopicNo.4)  Re[2]: スコープ演算子について
□投稿者/ barbapapa (3回)-(2009/07/23(Thu) 00:27:30)
ご回答どうもありがとうございます。
イメージ伝えにくかったので、確認したい場所をメインで記載したのですが、わかりにくくてすいません。
また、class B,CはAの派生です。(重要情報漏れていました。すいません。。)

文章で再度ご質問します。
あるクラス(A)のインスタンスをその他クラス(複数(例えばB、C))から参照する場合、自分はSingletonパターンで生成していたのですが、
その他クラス(B、C)をクラス(A)から派生させて、明示的にA::**(publicな関数や変数)で直接呼び出した場合もOKなのだろうかと思い質問させて頂きました。
プログラム上にて一つのインスタンスで動作させたい場合、明示的にスコープで呼ぶのもOKそうな感じでしたが、OKの場合、Singletonパターンの場合との使い分け等、利点欠点が良くわかりませんでした。


引用返信 編集キー/
■38670 / inTopicNo.5)  Re[3]: スコープ演算子について
□投稿者/ Jitta on the way (355回)-(2009/07/23(Thu) 07:04:42)
No38668 (barbapapa さん) に返信

> 文章で再度ご質問します。
> あるクラス(A)のインスタンスをその他クラス(複数(例えばB、C))から参照する場合、

ん?
もともとのコードは、インスタンスがどうこうというより、スタティックかそうでないかということが問題のように思えました。
ここ、理解が出来ていますか?


> 自分はSingletonパターンで生成していたのですが、
> その他クラス(B、C)をクラス(A)から派生させて、明示的にA::**(publicな関数や変数)で直接呼び出した場合もOKなのだろうかと思い質問させて頂きました。

クラス名::メンバー名 という呼び出しは、静的なメンバーへのアクセスです。



> プログラム上にて一つのインスタンスで動作させたい場合、明示的にスコープで呼ぶのもOKそうな感じでしたが、OKの場合、Singletonパターンの場合との使い分け等、利点欠点が良くわかりませんでした。

Singleton と静的なメンバーは違うものですよ。
引用返信 編集キー/
■38673 / inTopicNo.6)  Re[3]: スコープ演算子について
□投稿者/ επιστημη (2066回)-(2009/07/23(Thu) 08:40:51)
επιστημη さんの Web サイト
> あるクラス(A)のインスタンスを

class A {
  static A* body;
public:
  void f() { ... }
  staic A* instance() {
    if ( body == 0 ) body = new A();
    return body;
  }
};

A* A::body = 0;

> その他クラス(複数(例えばB、C))から参照する場合、
> 自分はSingletonパターンで生成していたのですが、

class B {
  A* pA;
public:
  B() : pA(A::instance()) {}
  void g() { pA->f(); }
};

class C {
  A* pA;
public:
  C() : pA(A::instance()) {}
  void g() { pA->f(); }
};

> その他クラス(B、C)をクラス(A)から派生させて、
> 明示的にA::**(publicな関数や変数)で直接呼び出した場合

class B : public A {
public:
  void g() { A::f(); }
};

class C : public A {
public:
  void g() { A::f(); }
};

> もOKなのだろうかと思い質問させて頂きました。

OKって、なにがOKなんですか?

> プログラム上にて一つのインスタンスで動作させたい場合、

後者の場合、AはB,Cに内包されるので一つのインスタンスじゃありませんが。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -