Archief - C# classen hulp gevraagd !

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

wyvernshill

Legacy Member
Ik volg informatica eerste jaar aan groepT maar ze gaan nogal te snel over het gebruik van klassen en objecten. Ook laten ze alles zien in "console" maar de oefening zelf moet dan plots in WPF gedaan worden.

Ik zit nu in de knoei, ik kan mijn constructor oproepen vanuit mijn wpf applicatie (aparte knop om de constructor te initialiseren) maar van het ogenblik dat ik via andere knoppen in mijn wpf een functie in mijn klasse moet oproepen krijg ik een foutmelding dat de naam van mijn klasse (de variable naam) niet voorkomt in de huidige context.

Wat doe ik mis ?

Hierbij wat ik tot nu toe heb in mijn "main" : (sorry hij haalt alle spaces weg :S)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Practicum_7
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void bt_maakThermostaat_Click(object sender, RoutedEventArgs e)
{
if (tb_zetGewensteTemperatuur.Text != "")
{
try
{
double test = Convert.ToDouble(tb_zetGewensteTemperatuur.Text);
Thermostaat thermostaat = new Thermostaat(test);
}
catch (FormatException)
{
MessageBoxResult errorBoodschap = MessageBox.Show("Gelieve numerieke waarden in te geven.\nDetails : De indeling van de invoertekenreeks is onjuist.", "Ingavefout");
}
}
else
{
Thermostaat thermostaat = new Thermostaat();
}

}

private void bt_vraagGewensteTemperatuur_Click(object sender, RoutedEventArgs e)
{
lbl_vraagGewensteTemperatuur = thermostaat.gewensteTemperatuur; (hier zit de fout)
}
}
}


Dit is mijn klasse :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Practicum_7
{
class Thermostaat
{
//DATALEDEN
private double huidigeTemperatuur;
private double gewensteTemperatuur;

//CONSTRUCTORS
public Thermostaat()
{
gewensteTemperatuur = 0d;
Random randomTemp = new Random();
huidigeTemperatuur = Convert.ToDouble(randomTemp.Next(15, 20));
}
public Thermostaat(double gewensteTemperatuur)
{
this.gewensteTemperatuur = gewensteTemperatuur;
Random randomTemp = new Random();
huidigeTemperatuur = Convert.ToDouble(randomTemp.Next(15, 20));
}
//FUNCTIES
public double GeefHuidigeTemperatuur ()
{
return huidigeTemperatuur;
}
public double VeranderGewensteTemperatuur(double veranderGewensteTemperatuur)
{
gewensteTemperatuur = gewensteTemperatuur + veranderGewensteTemperatuur;
return gewensteTemperatuur;
}
}
}

Tyfius

Legacy Member
Er bestaan CODE tags op dit forum om proper geformatteerde code tussen te zetten.

En een object (aangeduid via een variabele naam) bestaat alleen op de plaats waar je ze aanmaakt.

Code:
public class Foo {
  private Thermostaat m_thermostaat;

  public Foo() {
    m_thermostaat = new Thermostaat();
    Thermostaat temp = new Thermostaat();
  }

  public void Bar() {
    Console.WriteLine("Temp: {0}", m_thermostaat.GeefHuidigeTemperatuur());
    Console.WriteLine("Temp: {0}", temp.GeefHuidigeTemperatuur());
  }
}
De eerste met gebruik van m_thermostaat zal wel werken, de 2de niet want het object temp bestaat niet in de functie Bar.

Je hebt trouwens in de klasse Thermostaat wel al private variabele gedefinieerd die je in aparte functies gebruikt, dat is hetzelfde principe.

wyvernshill

Legacy Member
En dat is de miserie, de oefening zegt dat je "eerst" op de knop "aanmaken thermostaat" moet klikken alvorens je de andere knoppen mag kunnen gebruiken.

Maw het object wordt aangemaakt met de knop "aanmaken thermostaat" maar dat is het eerste deel onder :

private void bt_maakThermostaat_Click(object sender, RoutedEventArgs e)

maar als ik dan code wil bijmaken onder de knop "vraag de huidige temperatuur" dan plaatst hij dat volledig apart in mijn main zodat die functie de Thermostaat niet meer kent die ik via de knop "aanmaken thermostaat" heb geïnitialiseerd.

Hoe kan ik er voor zorgen dat hij de thermostaat gebruikt die ik via de knop heb aangemaakt en niet dat ik een nieuw object thermostaat moet aanmaken per extra knop/functie.

Tyfius

Legacy Member
Door je thermostaat object private te maken binnen je klasse.
Code:
public partial class MainWindow : Window
{
        [B][COLOR="Red"]private Thermostaat m_thermostaat;[/COLOR][/B]

        public MainWindow()
        {
                InitializeComponent();
        }

        private void bt_maakThermostaat_Click(object sender, RoutedEventArgs e)
        {
                if (tb_zetGewensteTemperatuur.Text != "")
                {
                        try
                        {
                                double test = Convert.ToDouble(tb_zetGewensteTemperatuur.Text);
                                [B][COLOR="Red"]m_thermostaat = new Thermostaat(test);[/COLOR][/B]
                        }
                        catch (FormatException)
                        {
                                MessageBoxResult errorBoodschap = MessageBox.Show("Gelieve numerieke waarden in te geven.\nDetails : De indeling van de invoertekenreeks is onjuist.", "Ingavefout");
                        }
                }
                else
                {
                        [B][COLOR="Red"]m_thermostaat = new Thermostaat();[/COLOR][/B]
                }

        }

        private void bt_vraagGewensteTemperatuur_Click(object sender, RoutedEventArgs e)
        {
                [B][COLOR="Red"]// Hier kan het misschien handig zijn om te controleren of m_thermostaat bestaat.
                // Indien dat niet het geval is moet je knop niets doen, anders ga je NRE's krijgen.
                if (m_thermostaat != null) 
                {
                        lbl_vraagGewensteTemperatuur = m_thermostaat.gewensteTemperatuur;
                }[/COLOR][/B]
        }
}

wyvernshill

Legacy Member
Duizendmaal dank, dat ene zinnetje "private Thermostaat m_thermostaat;" was wat het hele programma nodig had, anders liep alles fout (ok er waren er nog andere fouten, maar eens dit geregeld was ...)

Het programma werkt met exceptions ingebouwd (NullReference etc ...)

Hartelijk bedankt en hopelijk mag ik nog eens op je beroep doen :D
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan