2016-07-04 8 views
0

私は複数のクラスを持っているので、他のクラスの関数を使いたいです。しかし、私は問題に直面しており、あなたはそれを解決する方法を知っているかもしれません。この例でインスタンスを正しく使用する方法は?

クラス1 INICIO:

Master master = new Master(ip1.Text); 
master.Show(); 

Master slave = new Master(ip2.Text); 
slave.Show(); 

Arena arena = new Arena(); 
arena.Show(); 

クラス2マスター:

Arena arena = new Arena(); 

public Master(string ip) //Inicio 
{ 
    InitializeComponent(); 

    _droneClient = new DroneClient("192.168.1." + ip); 
    ip_drone = "192.168.1." + ip; 
    Point p2 = arena.posicao_desej(); 
    posicao_desejada = p2; 

    public string ip_dron() 
    { 
     return ip_drone; 
    } 

クラス3アリーナ:

Master master = new Master(""); //What do I insert here? I dont want to iniciate it again 

string ip = master.ip_dron(); 
ip_drone = ip; 

問題はMaster master = new Master("");である私はそれを削除した場合、すべてが動作しますが、Iそのクラスのものは使用できません。このように使用すると、フォームMasterとArenaが開いたら問題がクラッシュします。インスタンスを正しくインスタンス化するにはどうすればよいですか?

ERROR:

Make sure you do not an infinite loop or infinite recursion.

EDIT: 私の問題は、クラスINICIOは、マスターからの2つの異なるインスタンスが開きますので、2つの異なるIPを使用することです。 2つのインスタンスを実行すると、ipはip1.text、次にip2.textになります。しかし、彼らは同じ時間リターンで開くので、ip_droneだけ

public Master(string ip) //Inicio 
    { 
     InitializeComponent(); 

     _droneClient = new DroneClient("192.168.1." + ip); 
     ip_drone = "192.168.1." + ip; 
    } 

    public string ip_dron() 
    { 
     return ip_drone; 
    } 
+0

あなたは」アリーナは新しいMを作成するので無限ループを作り直すaster( 'マスターマスター=新しいマスター(" ");')それが呼び出されると、新しいアリーナ(「アリーナアリーナ=新しいアリーナ();」)が作成され、新しいアリーナを作成する新しいマスターが作成されます。あなたは、どのコードが何を開始するのかという論理を整理する必要があります。 – ADyson

+0

アリーナはマスターのインスタンスを取るべきです: 'Arena arena = new Arena(マスター)' –

+0

マスターとスレーブのコードは異なります。同じ3つのパラメータで2つの接続を持つことはできません。1)送信元IPアドレス2)宛先IPアドレス3)ポート番号。したがって、サーバーは競合を避けるためにIP.Anyで待機します。問題の根本原因は、例外が発生していることであり、クラスのインスタンスとは関係ありません。 – jdweng

答えて

2

問題が正しく理解できたら、使用したいMasterの特定のインスタンスをArenaクラスに提供する必要があると思います。現時点では、無限ループの原因となっているMasterクラスとArenaクラスの新しいインスタンスを作成しています(マスタが作成し、Arenaが作成され、Arenaなどが永遠に作成されます)。

私はこの問題を解決するかもしれないと思う:

クラス1 INICIO:

Master master = new Master(ip1.Text); 
Master slave = new Master(ip2.Text); 
Arena arena = new Arena(master, slave); //here we pass specific instances of Master to the Arena class for later use. 
arena.Show(); 

クラス2マスター:

class Master 
{ 
    public Master(string ip) 
    { 
    InitializeComponent(); 
    _droneClient = new DroneClient("192.168.1." + ip); 
    ip_drone = "192.168.1." + ip; 
    Point p2 = arena.posicao_desej(); 
    posicao_desejada = p2; 
} 

    public string ip_dron() 
    { 
    return ip_drone; 
    } 
} 

クラス3アリーナ:

class Arena 
{ 
    private Master master; 
    private Master slave; 

    public Arena(Master master, Master slave) //hint: maybe Master is not such a good name for the class...but that's another story 
    { 
    //here we assign the instances passed in to our internal variables, so we can reference them within the Arena class itself. 
    this.master = master; 
    this.slave = slave; 
    } 
    //and then for example (this may not be what you really want to do): 
    public string Show() 
    { 
    string masterIP = this.master.ip_dron(); 
    string slaveIP = this.slave.ip_dron(); 
    return "master IP: " + masterIP + ", Slave IP: " + slaveIP; 
    } 
} 
+0

うわー、ありがとう。出来た。 –

+0

ニースの答え。 - この初期の@TiagoSilvaを見ることができなくて申し訳ありませんが、あなたの問題が解決してうれしいです。 –

+0

もう一度、Adyson。あなたの例は不思議のように働いていましたが、今はArena関数をMasterに渡す必要があります。私の問題は、アリーナのインスタンスをマスターとスレーブに渡そうとすると、アリーナが作成された3番目のインスタンスであるため、アリーナ=ヌルと言います。 –

0

(この場合はip2.textに)最後の値を返しますがありあなたの質問のコードのいくつかの欠如はだが、私には、それは次のようになります。

Arena arena = new Arena(); 

そして、あなたは新しいMasterクラスを初期化し、すべての新しいArenaクラス:新しいArenaインスタンスを初期化し、すべての新しいMasterクラスで

Master master = new Master(""); 

だから、ArenaMasterクラスの無限の量を初期化しているようです。すべての新しいArenaのための新しいMasterがあるだろう、とあなたは、インスタンスを作成せずにArenaMasterクラスのメソッドを使用する場合は、すべての新しいMasterのための新しいArena.


があります常に、public staticと宣言してください。これにより、クラスインスタンスを宣言しなくてもアクセス可能になります。例えば

public class Arena 
{ 
    public static void DoSomething() 
    { 
     //Do something... 
    } 
} 

public class Master 
{ 
    public static void AnotherStaticMethod() 
    { 
     //Do something here too... 
    } 
} 

次にあなたがArena.DoSomething()Master.AnotherStaticMethod()のいずれかを呼び出すことにより、メソッドにアクセスできるようになります。

+0

コードはかなりシンプルです。 Inicioと呼ばれるWindowsFormがあります。ボタンをクリックすると、Masterのインスタンスが2つ開き(異なるipsを使用)、アリーナのインスタンスが1つだけ開きます。私はマスターやアリーナの新しいインスタンスを作成したくない。私はちょうどマスタークラスのアリーナの機能を使いたいと思っています。 –

+0

@TiagoSilva:私は、親クラスのインスタンスを作成せずにメソッドにアクセスする方法で答えを更新しました。 –

+0

私は前に静的インスタンスを持っていました。人々は私にそれを変更するように言った。私は静的で問題があったので私の質問を編集します。 –

関連する問題