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

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:

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

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

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?

0

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

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.

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.

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':

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':

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?

0

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

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?

1

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

0

Scoping

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?

 Facet[] TabFacet = new Facet[3];

Czy dopiero kiedy zainicjuje obiekt?

 Facet[i] = new Facet();
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ś.

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.

0

Wrzuć kod.

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':

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':

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.

0

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

0
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.

0
Patryk27 napisał(a):
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?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1