Gdzie tworzyć tablicę obiektów, a gdzie inicjować obiekty?

Gdzie tworzyć tablicę obiektów, a gdzie inicjować obiekty?
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Cześć,
Mam pytanie z serii "początkujący" :D
A Więc tak:
Tworzę jakiś tam mały projekt, stworzyłem do niego 3 klasy: Facet,Chart i Zakład. Wszystkie te klasy są o dostępie publicznym. I teraz w programie będzie trzech facetów i cztery charty, faceci stawiają zakłady na charty. Potrzebuję więc trzy obiekty typu Facet oraz cztery typu Chart.
W pliku Program.cs stworzyłem do nich tablice:

Kopiuj
Facet[] tabFacet = new Facet[3];
            Chart[] tabChart = new Chart[4]; 

I teraz chciałbym zainicjować te obiekty za pomocą kodu w stylu:

Kopiuj
tabFacet[i] = new Facet(); 

Próbuję to zrobić w miejscu kody od przycisku, po kliknięciu którego będzie potrzebny dostęp do tych obiektów, ale problem polega na tym, że program nie widzi stworzonej tablicy.
Możecie podpowiedzieć w którym pliku tworzyć tablicę, a w którym inicjować potem obiekty?

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Ale jakiego przycisku? Piszesz w jakimś frameworku GUI? Windows Forms? WPF?
I czemu chcesz te dane trzymać w Program.cs?

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Zwykły przycisk Button. Piszę w Windows Forms Application.
Czemu w 'Program.cs'? Dlatego że tam jest klasa Main, od której program zaczyna działanie, stąd pomyślałem że najpierw w programie powinny być stworzone tablice. Pierwszy raz piszę coś takiego, do tej pory zwykłe jakieś tam programiki konsolowe. Myślałem jeszcze nad tym, żeby dać to w bloku w którym znajduje się kod od przyciku, ale wtedy za każdym razem, gdy kliknę na klawisz będą się deklarowyły tablice co jest niepotrzebne.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Program to klasa, Main to metoda. W swoim Form nie widzisz pól z Program pewno dlatego, że nie są public.
Ale najprościej będzie, jak te tablice umieścisz jako pola klasy swojego okienka.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Sorry za chwilową nieobecność.

somekind napisał(a):

Program to klasa, Main to metoda. W swoim Form nie widzisz pól z Program pewno dlatego, że nie są public.

Właśnie kurcze nie :/ Kod z pliku 'Program.cs':

Kopiuj
namespace Laboartorium1
{
    public class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        public void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            Facet[] TabFacet = new Facet[3]; // TWORZĘ TABLICĘ
            
        }
    }
} 

Kod z pliku 'Form1.cs':

Kopiuj
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Laboartorium1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void stawiaButton_Click(object sender, EventArgs e)
        {
            int i = 0;

            TabFacet[i] = new Facet(); //PRÓBUJE ZAINICJOWAC OBIEKT - BŁĄD


        }
    }
} 

I błąd:
"The name "TabFacet" does not exist in the current context"

Może powinienem dodać jakiegoś usinga?

spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
0

Wstrzyknij TabFacet przez konstruktor albo prześlij obiekt klasy serwującej takie cosik

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
spartanPAGE napisał(a):

Wstrzyknij TabFacet przez konstruktor albo prześlij obiekt klasy serwującej takie cosik

Dzięki za podpowiedź, zaraz zagłębię się w ten temat. A potrafiłbyś wyjaśnić, dlaczego program nie widzi tej tablicy?

SO
  • Rejestracja: dni
  • Ostatnio: dni
1

Nie widzi, bo tamta tablica zadeklarowana jest w metodzie Main, więc jest dostępna tylko z poziomu tej metody.

spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
0

Scoping

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Poczytałem o tym konstruktorze. Konstruktor to metoda która nic nie zwraca i wykonuje się kiedy tworzony jest obiekt.
Czyli on wykona się kiedy ja tworzę tablicę obiektów?

Kopiuj
 Facet[] TabFacet = new Facet[3];

Czy dopiero kiedy zainicjuje obiekt?

Kopiuj
 Facet[i] = new Facet();
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Konstruktor to metoda która nic nie zwraca i wykonuje się kiedy tworzony jest obiekt.

Czyli on wykona się kiedy ja tworzę tablicę obiektów?

Sam sobie odpowiedziałeś.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

Ok, ale w takim razie nie bardzo wiem jak wykorzystać ten konstruktor w tym wypadku. Stworzyłem sobie tablicę w pliku 'Program.cs' i mam problem z tym, jak zainicjować obiekt. Problem polega na tym że w innym pliku nie widzę tej tablicy. Konstruktor póki co nic mi nie da bo przecież jeszcze nie zainicjowałem obiektu, a ten wykonuje się dopiero po inicjacji.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Wrzuć kod.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
Florian napisał(a):

Sorry za chwilową nieobecność.

somekind napisał(a):

Program to klasa, Main to metoda. W swoim Form nie widzisz pól z Program pewno dlatego, że nie są public.

Właśnie kurcze nie :/ Kod z pliku 'Program.cs':

Kopiuj
namespace Laboartorium1
{
    public class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        public void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            Facet[] TabFacet = new Facet[3]; // TWORZĘ TABLICĘ
            
        }
    }
} 

Kod z pliku 'Form1.cs':

Kopiuj
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Laboartorium1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void stawiaButton_Click(object sender, EventArgs e)
        {
            int i = 0;

            TabFacet[i] = new Facet(); //PRÓBUJE ZAINICJOWAC OBIEKT - BŁĄD


        }
    }
} 

I błąd:
"The name "TabFacet" does not exist in the current context"

Może powinienem dodać jakiegoś usinga?

W tym poście wrzuciłem już kod.

L0
  • Rejestracja: dni
  • Ostatnio: dni
0

wtf! bierzesz się za windows forms, a nie masz zielonego pojęcia o programowaniu.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0
Kopiuj
Facet[] TabFacet = new Facet[3]; // TWORZĘ TABLICĘ

W tym miejscu tworzysz zmienną lokalną, która jest widoczna tylko i wyłącznie wewnątrz tamtej metody.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
Patryk27 napisał(a):
Kopiuj
Facet[] TabFacet = new Facet[3]; // TWORZĘ TABLICĘ

W tym miejscu tworzysz zmienną lokalną, która jest widoczna tylko i wyłącznie wewnątrz tamtej metody.

Rozwiązanie tego problemu, to jedynie stworzenie jakiejś klasy o dostępie publicznym w której stworzę tą tablicę i potem używanie tej tablicy "poprzez" tą klasę, dobrze rozumiem?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Może być i tak, a możesz także po prostu samą tę tablicę przekazywać, akurat tutaj nie robi to większej różnicy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.