C++ Klasses: Klasse maakt gebruik van andere klasse

Ik heb een klasse die gebruik maakt van een andere klasse. De volgende code geeft dit weer.

int main(void) {
int x = 0;
foo f(x);
}

class bar(int j) {
private:
int getal;
public:
bar(int j) {
getal = j;
}
void test();
};

class foo(int i) {
public:
foo(int i) {
bar b(i);
}
void test2() {
b.test();
}
};

Ik krijg de melding dat in de klasse foo het object 'b' niet gedefinieerd is. Ik snap dit niet, in de constructor maak ik toch een klasse met het object 'b'? Kan iemand mij helpen?

moet je bar b al niet definieren in je main, zodat die beschikbaar is voor elke klasse?
of je moet een pointer gebruiken
of je moet de variabele meegeven bij het oproepen van de andere klasse

ik hou van werken ..., ik kan er uren naar kijken

Dank voor je snelle reactie!
Hoe bedoel je de variabele meegeven bij het oproepen van de andere klasse? Welke variabele bedoel je?

Je maakt inderdaad een object b binnen de constructor van foo. Maar dat is dan een locale variabele die alleen geldig is binnen de constructor.
Zodra de constructor klaar is, is die variabele weer weg.

Okee, dus ik moet het object b niet in de constructor aanmaken. Ik maak het nu aan als een private variabele in de klasse foo.

int main(void) {
int x = 0;
foo f(x);
}

class bar(int j) {
private:
int getal;
public:
bar(int j) {
getal = j;
}
void test();
};

class foo(int i) {
private:
int j;
bar b(j);

public:
foo(int i) {
j = i;
}
void test2() {
b.test();
}
};

Ik krijg nu alleen 2 errors...
Als ik het object b aanmaak in de klasse foo, kent hij getal j niet. Ik definieer daarboven toch int j?

De tweede error: '((foo*)this)->bar::test' does not have a class type. Ik maak toch het object b aan van de klasse bar? Hoezo krijg ik dan de error dat test geen klasse type is?

Als je b als private (of public) variabele aanmaakt, dan kun je 'm niet als member initialiseren met ronde haakjes. Gebruik daar dan accolades voor:

code:


class bar {
  private:
    int getal;
  public:
    bar(int j) { getal = j; };
    void test();
};

class foo {
  public:
    bar b{3};
    foo(int i) { };
    void test2() { b.test(); };
};

int main(void) {
  int x = 0;
  foo f(x);
}

c code:


class foo {
    public:
        bar b{j};
};

Ik gebruik Atmel Studio 7. Als ik dit doe krijg ik de volgende errors:

non-static data member initializers only available with -std=c++11 or -std=gnu++11

extended initializer lists only available with -std=c++11 or -stdgnu++11

Wat houden deze errors in?

Deze fout geeft aan dat initialiseren met een niet-statische waarde pas in de C++11 standaard is toegestaan. Dus als je een compiler gebruikt die nog uit gaat van een oudere taalstandaard, dit niet mag.

Zo te zien gebruikt Atmel Studio een onderliggende compiler die wel weet heeft dat het vanaf C++11 kan, maar (bewust) een oudere taalversie gebruikt. Mogelijk kun je dat ergens instellen?

En anders zul je een andere oplossing moeten zoeken. Je kunt iets doen met een pointer naar de klasse te definieren en deze later dynamisch te instantieren:

code:


class foo {
  public:
    bar *b;
    foo(int i) { b = new bar(i); };
};

Dus in de constructor van foo initialiseer instantieer je bar. Komt dan toch bijna op hetzelfde neer als wat je eerst wilde doen.

Ik heb de compiler geupdate naar C++11. Tijdens het compileren kreeg ik geen foutmelding meer. Echter gaat er wel iets fout, ik denk zelf dat het getal dat meegegeven wordt aan de klasse foo niet goed wordt meegegeven naar de klasse bar.

Bij het instantieren van de klasse bar krijg ik de volgende error: undefined reference to 'operator new(unsigned int)'

Ik heb hierop gegoogled maar werd er niet veel wijzer uit.

Als oplossing heb ik een aparte functie aangemaakt om het getal van de klasse foo naar bar mee te geven.

code:


class bar {
    private:
        int getal;
    public:
        bar {}
        void setGetal(int j)
        {
            getal = j;
        }
};

In de klasse foo roep ik die functie in de constructor aan:

code:


class foo {
    public:
        foo(int i)
        { 
            b->setGetal(i);
        }
};

Toch lijkt het erop dat het getal van de klasse foo niet goed naar bar wordt meegegeven, hetzelfde probleem als het veranderen van de compiler naar C++11...
Wat doe ik hier fout? Bij voorbaad dank voor alle hulp!

Probeer dit testprogrammaatje eens:

code:


#include <iostream>

class bar {
  private:
    int getal;
  public:
    bar(int j) { getal = j; }; 
    void test() { printf("%d\n", getal); };
};

class foo {
  public:
    bar *b;
    foo(int i) { b = new bar(i); };
    void print(void) { b->test(); };
};

int main(void) {
  int x = 5;
  foo f(x);
  f.print();
}

In de constructor van foo wordt een bar geinstantieerd, daarna wordt via foo een print-routine in bar aangeroepen. Bij mij drukt dit netjes de waarde 5 af.

Ik heb niet de beschikking over Atmel Studio, maar probeer het anders ook eens onder gcc? En uiteraard is je oplossing met setter-/getterfuncties ook prima.

big_fat_mama

Zie Paulinha_B

Kindertjes,

* wat heeft dit met electronica te maken (tenzij onrechtstreeks)?

* was het niet de regel om in "schoolvragen" geen antwoorden aan te dragen?

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Kindertjes? Really?

Het gaat hier om het programmeren van een Atmel microcontroller. Heeft meer met electronica te maken dan het accent van Sanne Wallis de Vries in een ander draadje.

Zie je niet dat het antwoord hier nou precies niet gegeven is?

Maar ik laat de hulp verder graag aan jou over, je schijnt het beter te weten.

Als ik jou testprogramma gebruikt print deze inderdaad netjes het getal 5.

Ik snap alleen niet dat het onderstaande programma crashed...
Zodra in de klasse bar het getal i wordt toegekend aan de variabele getal dan crashed het programma. Ik krijg de melding: Exception thrown: write access violation. this was nullptr.

Als ik stap voor stap het programma doorloop dan zie ik bij het aanroepen van de 'setGetal' functie dat het argument goed wordt meegegeven. Bij de functie setGetal(int i) is te zien dat i 15 i. Eén regel later kan i niet worden toegekend aan getal, ik krijg de melding unable to read memory.

Hoe kan dit?

code:


class bar
{
private:
	int getal;

public:
	void setGetal(int i)
	{
                //Na deze regel crashed het programma...
		getal = i;
	}
};

class foo
{
private:
	int test;
public:
	bar *b;
	foo(int j)
	{
		b->setGetal(j);
	}
};

int main(void)
{	
	int x = 5;
	foo f(x);
	cin.get();
}