2009-05-17 5 views
1

J'essaie actuellement de dessiner des formes avec des tableaux 2D. Dans ma classe, il y a un tableau global défini avec public char canvas[][];Appel d'un tableau global

Jusqu'à présent, je n'ai déclaré tableaux avec char canvas[][] = new char[height][width];

Si ce tableau a déjà été déclaré, et je ne suis pas censé modifier le code I » Comment est-ce que j'appelle une instance de ce tableau pour que je puisse l'utiliser?

merci.

(modifier) ​​

class DrawingSystem { 

    public char canvas[][]; 

     public static void makeNewCanvas(int tmpWidth, int tmpHeight) { 

     canvas[][] = new char[tmpHeight][tmpWidth]; 

     for (int row=0; row<tmpHeight; row++) { 
      for (int col=0; col<tmpWidth; col++) { 
       canvas[row][col] = ' '; 
      } 
     }  
    } 
+0

Pouvez-vous poster un peu plus de code? Est-ce que ce sont les devoirs? Si oui, le marqueriez-vous comme tel? – bedwyr

+0

J'ai ajouté le code de base. Comme mentionné, j'essaye juste d'appeler le tableau canvas dans la méthode MakeNewCanvas. Canvas doit rester en tant que tableau public, car je devrai l'utiliser et l'éditer dans d'autres méthodes dans DrawingSystem –

+0

Vous n'avez pas posé de questions à ce sujet, mais les variables statiques publiques ne sont pas vraiment un exemple de bonne conception. Vous rencontrerez toutes sortes de problèmes plus tard si vous continuez à coder comme ça. –

Répondre

2

Vous avez une incompatibilité entre les méthodes statiques et les variables d'instance. Pensez-y de la façon suivante: une variable d'instance est associée à une instance spécifique d'une classe; une variable statique est associée à la classe elle-même. Vous appelez les méthodes statiques via la classe:

ClassI.callStaticMethod(); 

Alors que vous appelez une méthode d'instance par une instance de la classe:

public ClassI classObj = new ClassI(); 
classObj.callInstanceMethod(); 

Dans le code affiché, il y a une variable d'instance ("toile") étant défini dans une méthode statique (main est associé à la classe, pas une instance). Par conséquent, vous devrez créer des méthodes d'instance pour modifier/mettre à jour votre "canevas" et créer une instance de la classe dans la fonction statique. Cet objet (une "instance") peut être utilisé pour mettre à jour la variable d'instance.

Voici un exemple:

public class Foo { 
    public char canvas[][]; 

    public static void main(String[] args) { 
     Foo fooObj = new Foo(); //creates an instance of this class 
     fooObj.createCanvas(2, 2); 
     fooObj.modifyCanvas(0, 0, 'c'); 
    } 

    public void createCanvas(int x, int y) { 
     canvas = new char[x][y]; 
    } 
    public void modifyCanvas(int x, int y, char c) { 
     canvas[x][y] = c; 
    } 
} 

C'est évidemment pas une à une corrélation avec votre mission, mais je suis sûr que vous serez en mesure de l'adapter à ce que vous faites :-)

+0

Merci bedwyr. Avec l'exemple que j'ai posté, ma classe est référencée par la méthode Main dans une autre classe (monde) Ce code a été fourni, donc tout ce que je dois faire est de créer les méthodes dans la classe appelée (ed, methods dans DrawingObect) . Mais j'ai réalisé ce que c'était. Jusqu'à présent, je n'avais jamais travaillé que dans une classe, donc j'utilisais toujours le statique pour définir mes méthodes, mais comme la classe DrawingSystem n'est pas publique, je ne devrais pas inclure de statique quand je définis mes méthodes. Est-ce correct? J'ai enlevé statique du nom de la méthode et il est maintenant conforme. –

+0

Vous avez raison. Le mot-clé 'static' doit uniquement être utilisé lorsque vous ne souhaitez pas conserver l'état à l'aide d'une instance d'une classe (par exemple, une méthode d'utilitaire qui prend des entrées et fournit une sortie - voir Math.abs). Dans votre cas, static ne fonctionnera pas avec la variable d'instance avec laquelle vous travaillez. Bon travail! – bedwyr

+0

Génial! Merci encore! –

0

Kinda confus au sujet de ce que vous demandez.

Vous pouvez toujours redéclarer le tableau global à tout moment, et l'utiliser pour vos propres besoins ... mais cela semble plutôt suspect (ce qui signifie ... pourquoi serait-ce un tableau global).

Il semble que votre toile ne devrait pas changer de taille ... mais encore une fois, je ne connais pas grand-chose à votre situation.

Vérifiez si la matrice est nulle, si oui, déclarez-la comme la taille que vous voulez et utilisez-la avec bonheur?

+0

Salut, Merci pour la réponse. La raison pour laquelle le canevas est global est qu'il peut être modifié par toutes les méthodes de la classe. La première méthode le définit, la seconde dessine un carré et la troisième l'imprime. Le tableau Array a déjà été défini dans la classe comme un tableau public, j'ai juste du mal à l'appeler dans les méthodes, comme si j'utilisais simplement canvas = new char [tmpHeight] [tmpWidth]; à l'intérieur de la méthode, j'obtiens l'erreur "toile de variable on-static ne peut pas être référencée à partir d'un contexte statique" en essayant de complie. –

1

Je ne sais pas si je suis bien compris votre question,

Mais semble que vous avez besoin d'un modèle Singleton, au lieu de déclarer le char canvas[][] comme champ public, encapsuler le tableau de la toile en lecture seule propriété

public class MyDrawing 
{ 

private char canvas[][] = null; 

public char[][] getCanvas() 
{ 
    if (canvas!=null) 
    { 
     canvas =new char[height][width]; 
    } 
    return canvas; 
} 

Lorsque vous utilisez getCanvas() dans d'autres parties de votre code lorsque vous avez besoin du tableau de canevas au lieu de la variable publique canevas précédemment utilisée.

2

Votre problème est que makeNewCanvas(int tmpWidth, int tmpHeight) est statique ou public char canvas[][] n'est pas statique.

En Java, les membres de la classe statique ne peuvent travailler qu'avec d'autres membres de la classe statique. Les membres statiques appartiennent à la classe et les membres non statiques appartiennent aux instances. La classe est un modèle utilisé pour créer des objets, ces objets sont appelés instances de la classe. Lorsque vous déclarez quelque chose de statique, il est partagé par toutes les instances de la classe. Dans le cas des méthodes, cela signifie que les méthodes statiques doivent se comporter exactement de la même manière sur toutes les instances.

DrawingSystem a = new DrawingSystem(); 
DrawingSystem b = new DrawingSystem(); 

a et b sont par exemple de la classe DrawingSystem qui signifie qu'ils ont chacun leur propre tableau canvas. Maintenant, puisque makeNewCanvas est statique et doit se comporter de la même manière pour toutes les instances, il ne peut pas utiliser a.canvas ou b.canvas car ils sont uniques à a et b et peuvent avoir des contenus différents.

+0

Merci Nash, ouais, j'ai réalisé ce qui n'allait pas après que bedwyr a posté sa réponse. Comme je l'ai mentionné ci-dessus, je n'ai travaillé que jusqu'à présent au sein d'une même classe, c'est donc la première fois que j'utilise des objets en Java, donc j'appelle encore les méthodes statiques ... Merci encore. Un –

+0

Pas de problème, et il n'y a rien de mal à être nouveau à quelque chose! – nash