また、よろしくおねがいします。
あるインスンタンス(A)から別のクラスをnewしてインスタンス(B)を作成し

class A{
public A(){}
B b = new B();
public hoge(){
System.out.plintln("hoge");
}
}

class B{
public B(){}
A.hoge(); <<= ここから自クラスをnewしたAのhoge()を起動させたい
}

こんな風にnewされたB側からAのメソッドを動かしたいなんて場合は、どのようにするんでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

もう一つ別の方法として、class Bをclass Aの内部クラスにしてしまうという方法があります。



class A {
class B {
public B() {}
void x() {
A.this.hoge(); // 内部クラスBのインスタンスからAのインスタンスメソッドを呼ぶ書き方
}
}
Aの実装以下略
}
    • good
    • 0
この回答へのお礼

ぬおおありがとうございます。動きました。m(_ _)m

お礼日時:2011/04/25 04:34

一般論として、Bのインスタンスは自分をnewしたのが誰なのかを知る方法がありません。


どのAのインスタンスがnewしたのか、Bに教えてあげる必要があります。

class B {
private A oya;
public B(A a) {
oya = a;
}
}

AのインスタンスがBをnewするときには B b = new B(this); とします。
こうすればoya.hoge()のようにしてAのインスタンスメソッドを呼べます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++ クラスをメンバにもつクラスについて

お世話になります。C++初心者でうまくコードが書けません(><)
クラス1と2があり、クラス1のメンバにはクラス2があります。
メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。
func2ではクラス1のインスタンスから呼び出された場合にクラス1の
m_int1を取得します。
Class Class1{
public:
 int m_int1;
 Class2 m_Class2;
};
Class Class2{
public: void func2();
};
void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}
void main(){
 class1 C1;
 C1.m_int1 = 10;
 C1.m_class2.func();
}
C1.m_class2.func()の中から呼び出したC1にアクセスする方法が
分かりません(TT)。実体がまだあるのだからアクセスする方法は
あると思うのですが・・・
どなたかよろしくお願いします。

お世話になります。C++初心者でうまくコードが書けません(><)
クラス1と2があり、クラス1のメンバにはクラス2があります。
メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。
func2ではクラス1のインスタンスから呼び出された場合にクラス1の
m_int1を取得します。
Class Class1{
public:
 int m_int1;
 Class2 m_Class2;
};
Class Class2{
public: void func2();
};
void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に...続きを読む

Aベストアンサー

おそらくインスタンスに対する勘違いをされていると思います。

void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}

ここで行っているのは、あくまで func2関数内のローカル変数として宣言されているC2_1のm_int1に100を代入しているだけで、本来行いたい代入先とは別のインスタンスです。

*解決方1
func に class1のインスタンスを特定できる情報を渡す

public:
void func2 (class1 *ptr);
void func2 (class1 &ptr);
など。

*解決法2
class2 のコンストラクタで、自分をメンバ変数として持ってくれるclass1のポインタ等をもらう。

class class2
{
public:
class2 (class1 *ptr)
: m_ptr (ptr)
{
}
void func ()
{
m_ptr->m_int1 = 100;
}
private:
class1 *m_ptr;
}

です。
ちなみに解決法2ではwarningが発生しますが^^;

おそらくインスタンスに対する勘違いをされていると思います。

void Class2::func2(){
 /*ここの記述方法が分かりません*/
 /*C1から呼び出されたらC1のm_int1に100を入れる*/
 /*以下間違え*/
 class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/
 C2_1.m_int1 = 100;
}

ここで行っているのは、あくまで func2関数内のローカル変数として宣言されているC2_1のm_int1に100を代入しているだけで、本来行いたい代入先とは別のインスタンスです。

*解決方1
func に cl...続きを読む

Q内部クラスから別の内部クラスのインスタンスを取得するには

早速ではございますが質問をさせていただきます。
以下のクラスで、
//////////////////////////////////////////////////
class A
{
class B {}
class C {}
}
//////////////////////////////////////////////////
内部クラスB内で内部クラスCのインスタンスを取得するに
はどうすればよいのでしょうか?どうかご教授のほど
よろしくお願いします。

Aベストアンサー

こんな↓のでコンパイルできますね。
class A {
class B {
B(){
new C();
}
}
class C {}
}

QC#で同じクラスAを継承したクラス1~20に対しての処理をきれいにしたい

C#でClassAを継承したClass1~20があり、
それらに以下のような処理をしているのですが、行数が増えすぎて見難いです。
もっと綺麗に書く方法はないのでしょうか?
class10の処理が「同じ処理」ならClassA型の配列でいけそうなんですが…。
class10だけ配列に入れないか、配列に入れてclass10の部分だけスキップするしか方法はないんでしょうか?
(頭が小文字なのはそのクラスのインスタンスです)
if(class1 != null)
{
  class1.同じ処理
}
if(class2 != null)
{
  class2.同じ処理
}
if(class3 != null)
{
  class3.同じ処理
}
   ・
   ・
   ・
if(class10 != null)
{
  class10.別の処理
}
   ・
   ・
   ・
if(class20 != null)
{
  class20.同じ処理
}

Aベストアンサー

> class10の処理が「同じ処理」ならClassA型の配列でいけそうなんですが…。
なら、メソッドを呼び出す側から見て同じ処理にしてしまえばいいんです。
そのためのメソッドのオーバーライドです。

public ClassA
{
 // ......

 public virtual void someMethod()
 {
  同じ処理
 }
}

Class10 : ClassA
{
 // ......

 public override void someMethod()
 {
  別の処理
 }
}

という具合にして、ClassA型の配列で回して someMethod() を実行しましょう。
someMethod() の引数・戻り値はやりたい処理に合わせて修正してください。

Qnew演算子が、インスタンスの参照を返さない!?

どうもこんにちは。

現在、iアプリ向けプログラムを作成しています。
しかし、あるクラスだけが、インスタンスを作成できない(?)
ようです。

他のクラスの記述と、見比べても差がほぼありません。
コンストラクタの中に、何も書かないようにしたりしてもダメでした。

サンプルコードは、これです。

// ---------------------------------------------------------- //
Window window = new Window( 10, 15+(15*6),
              D.WIN_FLAG_NOCONTROL, 8, 8, 8 );

System.out.println( "エフェクト"+ new Effect() );

//つまり、コンストラクタから参照が得られないのが、問題
Effect effect = new Effect();
System.out.println("effect:"+effect);
// ---------------------------------------------------------- //

まとめると、Windowクラスのインスタンスは、作れるのに、
Effectクラスは、作れないという事です。
new Effect()のところで、NullPointerException例外が、発生してしまいます。

下記は、Effectクラスのコンストラクタです。
//コンストラクタ
Effect()
{
g = MainCanvas.g;
nKey = MainCanvas.nKey;
}

特に変わったところは、ありません。
コンストラクタ内の二行を消しても、同じ結果でした。

もしかして、KVMが、壊れたとかでしょうか?
ヒープの容量も十分にあったので、それが問題では無いと思いますが、
どうでしょうか?

見直すポイントがあれば、教えて下さい。
お願いします。

どうもこんにちは。

現在、iアプリ向けプログラムを作成しています。
しかし、あるクラスだけが、インスタンスを作成できない(?)
ようです。

他のクラスの記述と、見比べても差がほぼありません。
コンストラクタの中に、何も書かないようにしたりしてもダメでした。

サンプルコードは、これです。

// ---------------------------------------------------------- //
Window window = new Window( 10, 15+(15*6),
              D.WIN_FLAG_NOCONTROL, 8, 8, 8 );

System.o...続きを読む

Aベストアンサー

Effectクラスのstaticな部分またはインスタンスフィールドでnull参照をしてしまう処理はないでしょうか?
各クラスのstatic部分の処理は一番最初にクラスが参照されるときに発生します。インスタンスフィールドが初期化される処理はコンストラクタが呼び出され、コンストラクタの中の処理に入る直前です。

QC++/CLIでクラス内の要素を相互利用する方法

C++/CLIでクラスの中に定義された構造体等を、複数のクラス間で相互利用したいのですが、そのようなことは可能なのでしょうか。

とりあえず以下のコードを見ていただきたいのですが、

ref class class1;
ref class class2;

ref class class1
{
public:
 enum struct enum1
 {
  aa,bb
 };

 void func1a(class1^ obj){} // 1. OK
 void func2a(class2^ obj){} // 2. OK

 void func1b(class1::enum1 e){} // 3. OK
 void func2b(class2::enum2 e){} // 4. ERROR
};

ref class class2
{
public:
 enum struct enum2
 {
  aa,bb
 };

 void func1a(class1^ obj){} // 5. OK
 void func2a(class2^ obj){} // 6. OK

 void func1b(class1::enum1 e){} // 7. OK
 void func2b(class2::enum2 e){} // 8. OK
};

これの4.がコンパイルエラーになります。
このような構造を定義することはできないのでしょうか。

C++/CLIでクラスの中に定義された構造体等を、複数のクラス間で相互利用したいのですが、そのようなことは可能なのでしょうか。

とりあえず以下のコードを見ていただきたいのですが、

ref class class1;
ref class class2;

ref class class1
{
public:
 enum struct enum1
 {
  aa,bb
 };

 void func1a(class1^ obj){} // 1. OK
 void func2a(class2^ obj){} // 2. OK

 void func1b(class1::enum1 e){} // 3. OK
 void func2b(class2::enum2 e){} // 4. ERROR
};

ref class ...続きを読む

Aベストアンサー

 こんばんは。
 どうやら、無理な様です。
 列挙体をクラスの外に出して一番上に書けば解決ですが、如何してもクラス内に置く事を死守するのであれば、「4」のメンバ関数をテンプレートにして、class2::enum2が見えている所でテンプレートの全特化を行えば出来ます。
 以下参考程度になれば。

// clrconsole.cpp : メイン プロジェクト ファイルです。
#include"stdafx.h"

using namespace System;

ref class class1;
ref class class2;

ref class class1
{
public:
enum struct enum1
{
aa,bb
};

void func1a(class1^ obj){} // 1. OK
void func2a(class2^ obj){} // 2. OK

void func1b(class1::enum1 e){} // 3. OK
template<class _Enum>
void func2b(_Enum e);// 4. 中身を引っこ抜く
};

ref class class2
{
public:
enum struct enum2
{
aa,bb
};

void func1a(class1^ obj){} // 5. OK
void func2a(class2^ obj){} // 6. OK

void func1b(class1::enum1 e){} // 7. OK
void func2b(class2::enum2 e){} // 8. OK
};

// 4. 中身
template<>
void class1::func2b<class2::enum2>(class2::enum2 e)
{
//class2::enum2の時のみ
}

int main(array<System::String ^> ^args)
{
class1^ c = gcnew class1();

c->func2b(class2::enum2::aa);
c->func2b(class2::enum2::bb);

//適合しないenumを入れるとリンクエラーになる
//c->func2b(class1::enum1::aa);
//c->func2b(class1::enum1::bb);

return 0;
}

 こんばんは。
 どうやら、無理な様です。
 列挙体をクラスの外に出して一番上に書けば解決ですが、如何してもクラス内に置く事を死守するのであれば、「4」のメンバ関数をテンプレートにして、class2::enum2が見えている所でテンプレートの全特化を行えば出来ます。
 以下参考程度になれば。

// clrconsole.cpp : メイン プロジェクト ファイルです。
#include"stdafx.h"

using namespace System;

ref class class1;
ref class class2;

ref class class1
{
public:
enum struct enum1
{...続きを読む

QJAVAで別のクラスのprotectedインスタンス変数のアクセス

protectedの場合、自分のクラスか継承されたクラスへのアクセスしかできないと思い、エラーが出るプログラムを書いたつもりでしたが、コンパイルし、実行結果も123が表示されました。

予想では、private, protectedがエラーで、デフォルト、publicだとうまくいくとおもっていましたが、protectedでアクセスできた理由がわかりません。
どなたか、おしえていただけますでしょうか?

なお、JDKは1.8.0_77です。

<実行結果>
E:>javac test.java
E:>java test
123

<プログラム>

class abc{
protected int a = 123;
}

class test{
public static void main(String[] str){
abc o = new abc();
System.out.println(o.a);
}
}

Aベストアンサー

protectedは、クラス内、継承されたクラス内以外にも、同一パッケージ内からのアクセスも可能です。質問文のプログラムでは、abcクラスもtestクラスも同一パッケージ(パッケージ無し)ですので、エラーとなりません。

もし、protectedでクラス外からアクセスしようとしてエラーになることを確認したい場合は以下のようにする必要があります。

<ソースファイル a¥abc.java>
package a;

class abc{
protected int a = 123;
}

<ソースファイル b¥test.java>
package b;

import a.*;

class test{
public static void main(String[] str){
abc o = new abc();
System.out.println(o.a);
}
}

<コンパイル方法>
javac a¥abc.java
javac b¥test.java

上記の2行目のjavacの実行時にprotectedのためにエラーとなります。

QC,C++,C++/CLIの構造体とクラス

C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが
privateかpublicかという違い「だけ」しか全くないのでしょうか?

クラスにおける
value class / ref class
という分類はC++/CLIのもので
これについては
value class の方は C言語の構造体に近いという事でいいでしょうか?

ref classの方は
ネイティブのC++のクラスを
マネージ用にしたようなもので

C++/CLIの構造体は
C++のそれと同じで
OKですか?

そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

Aベストアンサー

> ということは、structも継承可、という事でしょうか?

structでも継承可能です。

> 継承のアクセス指定の方は
> クラスと構造体ではどうなるのでしょうか?

class A : Base {};



class A : private Base {};

と等価です。
一方、

struct A : Base {};



struct A : public Base {};

と等価です。

> そして「集成体」というのが初めて知ったのですが
> これはいわゆる、配列や・・・ある条件下でのクラス・・?
> なのでしょうか?

配列と以下の条件をすべて満たすクラスのことです。
・ユーザー定義のコンストラクタを持たない
・非公開または限定公開のメンバを持たない
・基底クラスを持たない
・仮想関数を持たない

ちなみにC言語の集成体は、配列と構造体の総称です(共用体は集成体ではありません)。

Qクラス内からインスタンス先の名前を参照する事は出来るのでしょうか

クラス内からインスタンス先の名前を参照する事は出来るのでしょうか

例えば
function hoge(){
 this.dispname=function{
  alert("xxxxx");
 }
}

 var fuga1=new hoge();
 var fuga2=new hoge();
とインスタンスして、
 fuga1.dispname();
 fuga2.dispname();
とした時
xxxxにそれぞれ'fuga1'、'fuga2'といった名前
を取得してセットすることは可能でしょうか?

逆なら、
 alert(fuga1.constructor.name); //Alerts "hoge"
 alert(fuga1.constructor.name); //Alerts "hoge"
と出来る。

※インスタンスする時に名前を渡すしかないんでしょうか。
 var fuga1=new hoge('fuga1');みたいに...

Aベストアンサー

思いつきですみません、とりあえずwindowを総なめするとか?

<script>
function hoge(){}
hoge.prototype.dispname=function(){
for(var i in window){
if(window[i]==this){
alert(i);
break;
}
}
}
var fuga1=new hoge();
var fuga2=new hoge();
fuga2.dispname();
fuga1.dispname();
</script>

QC#クラスについて教えてください

下記通りクラスを作成した場合、プロパティaを配列にできますか?
class Class1
{
public string a { set; get; }
public int b { set; get; }
public int c { set; get; }
}



イメージとしては下記通りにしたいのですが、なかなかうまく行きません。
class Class1
{
public Class1(int x)
{
}
public string a[x] { set; get; }
public int b { set; get; }
public int c { set; get; }
}

private void Form1_Load(object sender, EventArgs e)
{
Class1 f = new Class1(2);
f.a[0] = "asdf";
f.a[1] = "asdfa";
f.a[2] = "asdfasd";
f.b = 1;
f.c = 2;
}
初心者なんで、やさしく教えてください。お願いします。

下記通りクラスを作成した場合、プロパティaを配列にできますか?
class Class1
{
public string a { set; get; }
public int b { set; get; }
public int c { set; get; }
}



イメージとしては下記通りにしたいのですが、なかなかうまく行きません。
class Class1
{
public Class1(int x)
{
}
public string a[x] { set; get; }
public int b { set; get; }
public int c { set; get; }
}

private void Form1_Load(object sender, EventArgs e)
{
Class1 f = new Clas...続きを読む

Aベストアンサー

class Class1
{
 public string[] a { get; set; }

 public Class1(int x)
 {
  a = new string[x+1];
 }
}

こんな感じですか??

Qクラスインスタンスとクラス型変数の配列

C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。
最初にC++のサンプルを書かせていただきます。
----- C++ -----
class Hoge {
 /* 実装省略 */
}

int main( void )
{
 Hoge *hoge = new Hoge ;
 Hoge *hoge = new Hoge[10] ;
}

---------------

これをJAVAで実装した場合、以下のようになると思います。

----- JAVA -----
class Hoge {
 /* 実装省略 */
}

class Test {
 public static void main( String[] args )
 {
  Hoge hoge = new Hoge() ; /* 1 */
  Hoge[] hoge = new Hoge[10] ; /* 2 */
 }
}
---------------

JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。

そうすると、
int[] a = new int[10] ;
と、
Hoge[] hoge = new Hoge[10] ;
のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。

私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。

よろしくお願いします。

C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。
最初にC++のサンプルを書かせていただきます。
----- C++ -----
class Hoge {
 /* 実装省略 */
}

int main( void )
{
 Hoge *hoge = new Hoge ;
 Hoge *hoge = new Hoge[10] ;
}

---------------

これをJAVAで実装した場合、以下のようになると思います。

----- JAVA -----
class Hoge {
 /* 実装省略 */
}

class Test {
 public static void main( String[]...続きを読む

Aベストアンサー

> JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。
> C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、
> JAVAの場合は考え方が違うものだということでしょうか。
 いえ~すざっつらいと。Javaでは、new Hoge[10]という式は「要素数が10で固定されているHogeの配列型」のインスタンスが生成される。ぶっちゃけ、Arrayクラスのインスタンスと思ってもらって差し支えない。参照先がnullである10個のHoge変数という事だな。なので、10個のそれぞれについてHogeクラスのインスタンスを生成して代入してあげないといけない。
 intの場合はすぐ使えるじゃん! と思うかも知れないが、Javaの場合、これは値型の変数と参照型の変数という扱いで、CやC++で言う普通の変数とポインタ変数の違いと思って良い。なので、Javaでは「intの配列型」をインスタンス化すると、それは中身が参照でなくて値そのものなのですぐ使えるというわけだ。この辺は、

int i; // すぐ使える。値そのもの。
Hoge h; // nullなので、Hogeのインスタンスを代入してあげないと使えない。

と同じものだ。つまり、Hogeの配列型をインスタンス化する、とは、次の事と同じになる。

Hoge hoge0;
Hoge hoge1;
Hoge hoge2;
・・・
Hoge hoge9;

これは全部nullやんな。結論としては、「配列をnewすると、変数が作られる」という事になる。

> JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。
> C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、
> JAVAの場合は考え方が違うものだということでしょうか。
 いえ~すざっつらいと。Javaでは、new Hoge[10]という式は「要素数が10で固定されているHogeの配列型」のインスタンスが生成される。ぶっちゃけ、Arrayクラスのインスタンスと思ってもらって差し支えない。参照先がnullである10個のHoge変数という事だな。なので、10個の...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報