内部クラスのスコープ、friendクラスのスコープについて詳しいかたお願いします。
以下のクラス構成の場合に、
1.Outerクラスのすべてメンバー関数からはInnerクラスのすべての関数にアクセスできるのでしょうか?
2.InnerクラスからOuter::outerPrivateFunction(); を利用するためにはInnerクラスをOuterクラスのfriendにする方法以外にありますでしょうか?
3.InnerクラスからOuter::outerInt にどのようにしてもアクセスできません。ためした方法はInnerクラスをOuterクラスのfriendにする方法です。
このようなクラス構成にしてしまうと不可能なのでしょうか?
4.friendにしたクラスはprivateの変数、関数にアクセス可能になるはずですが、
それは外部クラスに限ってのことで内部クラスには当てはまらないのでしょうか?
class Outer {
private:
class Inner {
Innerfunction();
Onter* pOuter;
}
outerPrivateFunction();
int outerInt;
}
説明に不足があれば補足いたしますのでお詳しいかた宜しくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんばんは。
再投稿です。↓すんません、仕出かしてしまいました。これはNGです。
void outerPrivateFunction()
{
Inner().Innerfunction();
}
以下問題点・御指摘頂いた点を修正してみました。VC6.0とVC2005でコンパイル、実行もしてあります。
どうやらOuter::が無くても良い(?)様です。
//friend class Innerを妨害するための独立したInnerクラス
class Inner
{
void Innerfunction(){}
int a;
int b;
};
//本題のクラス
class Outer
{
private:
class Inner;
friend class Inner;
class Inner
{
private:
friend Outer;
public:
explicit Inner(Outer* p) : pOuter(p){}
private:
void Innerfunction()
{
pOuter->outerInt++;
pOuter->outerPrivateFunction();
}
void Innerfunction2(){}
Outer* pOuter;
};
public:
Outer() : inner(this), outerInt(0){}
void outerPublicFunction(){inner.Innerfunction();}
private:
void outerPrivateFunction(){inner.Innerfunction2();}
Innerinner;
intouterInt;
};
「More C++ Idioms/内部クラス(Inner Class)」
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms …
この回答への補足
>どうやらOuter::が無くても良い(?)様です。
これですが必要ないと思います。
Interクラスの仮定義をOuterクラスの外に出すか、中に書くかで
外部クラス、内部クラスを指定することができるのではないでしょうか。
ですので、上記コードですと、class Innter;(仮定義)をコメントアウトすれば
、妨害するための独立したInnerクラスをfriendにすることができるのではないでしょうか。
補足ありがとうございます。わざわざ動かしていただいたみたいで。
friend Outer;が少しはまりそうなので覚えておきます。
friend class Outer;としてしまいそうです。
No.2
- 回答日時:
Outer側のfriend宣言は
friend class Outer::Inner;
としてやれないといけないでしょう
friend class Inner;
と書いてしまっては
class Outer
{
};
Class Inner
{
};
と独立したクラスだと解釈されるでしょう
Innerfunctionは Outerの参照を引数にとるかInnerクラスのコンストラクタでpOuterを初期化するとかしないとpOuterの初期化ができないように思います
OuterのouterPrivateFunctionやouterIntがprivateならInnerクラスに
friend class Outer;
が無いとエラーになるでしょう
No.1
- 回答日時:
こんにちは。
1・はい。Innerクラスのメンバ関数へのアクセス指定をpublicにすれば可能です。
2・はい。ただ、するべき事では無いかと。
Outerクラスにstaticメンバ関数などを置き、その関数がOuter::outerPrivateFunction()のメンバ関数ポインタを返せば出来ます。
ただ、メンバ関数ポインタを返す関数は、publicでないと出来ません。
3・friendの書き方が悪かったのかもしれません。
4・可能な筈です。
以下で通る筈です(余白を空ける為に全角スペースを入れているので要注意)。
class Outer
{
private:
class Inner;
friend class Inner;
class Inner
{
public:
void Innerfunction()
{
pOuter->outerPrivateFunction();
pOuter->outerInt;
}
private:
Outer* pOuter;
};
void outerPrivateFunction()
{
Inner().Innerfunction();
}
int outerInt;
};
ありがとうございます。
確認したところ、ご指摘どおりfriendの書き方が悪く、
class Innerの仮定義をclass Outerの外に出しておりました。
内部クラスの場合には、内部で定義する必要があるのですね。
とても助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 英語 英語 別のクラスの友達 英作文で、別のクラスの友達 と表現したいとき、どういう表現ができますか? a 2 2022/05/31 18:28
- HTML・CSS HTMLのdlとul どちらが正しいと思いますか 3 2023/02/23 11:20
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- 中学校 終わった…。 中2です。いろいろと終わりました…。 1つ目が塾…。私の塾では学校のテスト前(中間テス 10 2022/05/24 17:55
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- 大学受験 大学受験について。 都内の偏差値60程度の中高一貫校に通っている高一です。大学では商学部や経営学部に 5 2022/11/09 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
Java
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
無名パッケージからのインポート
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
リフレクション
-
親クラスから子クラスへアクセス。
-
オブジェクトのデータをもとにX...
-
プログラムの変数名にするとど...
-
サブクラスで.newInstance()で...
-
java-別クラスの変数の使い方を...
-
import と extends について
-
範囲外の数値を代入したらエラ...
-
生成されたサーブレットのエラ...
-
Javaでswingの画面変わる際に他...
-
違うクラスからの変数の共有化
-
Java リフレクションについて
-
型Containerのメソッドadd(S...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
SwingでgetContentPaneのエラー...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報