Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen

Aus einem für mich unerfindlichen Grund kann ich aus meiner Klasse Person keine Methoden der davon erbenden Klasse Trader aufrufen.


class Person // Person ##################################################################################
{
//friend class Item;
//friend class Ort;
friend class Trader;

private:
int health;
int maxhealth;
int action;
int maxaction;
int attack;
int defence;
string name;
string ort;
int level;
int experience;
int money;
string item;
string say;
string waffe;
static int objectNumber;
public:
...
void lookAround(vector<Ort*> *arrOrt, vector<Person*> *arrPerson, vector<Trader*> *arrTrader, vector<Item*> *arrItem, Person *player)
{
...
cout << "Haendler: \n";
for (size_t i=0; i<arrTrader->size(); i++)
{
if (arrTrader->at(i)->getOrt() == ort)
{
cout << " " << arrTrader->at(i)->getName() << "\n";
check = 1;
}
}
if (check == 0)
{
cout << " Niemand hier...\n";
}
...
class Trader : public Person
{
friend class Person;
private:
vector<string> ware;
vector<int> preis;

public:
Trader(vector<string> war, vector<int> prei, string na, string o, string s) : Person(na, o, s)
{
ware = war;
preis = prei;
name = na;
ort = o;
say = s;
}
...
[/PHP]

Als Fehler wird mir angezeigt:

In der Zeile: [i]if (arrTrader->at(i)->getOrt() == ort)[/i]

invalid use of undefined typ 'struct' Trader

In der Zeile: [i]friend class Trader;[/i]

forward declaration of 'struct' Trader

In der Zeile: [i]cout << " " << arrTrader->at(i)->getName() << "\n";[/i]

nochmal invalid use of undefined typ 'struct' Trader

und die Fehlermeldung der friedclass-Zeile

woran liegt das? Ich kann Objekte anderer Klassen ohne Probleme in der Methode anzeigen lassen..

Hi,

mmh....irgendwie kann das nicht gehen, denn bevor ein Trader erzeugt wird, muss ja erst eine Person erzeugt werden. Das geht aber nicht, wenn die Klasse Person einen Trader benötigt. Du müsstest eine Vorwärtsdeklaration außerhalb der Klassendefinition machen.

Sowas riecht aber meistens nach einem Designfehler.

Trader und Personen werden aus .ini's erzeugt. Und zwar erst Trader, dann Personen. Sollte doch so stimmen, oder?

Bearbeitet von GeneralB

Hi,

also von der Logik her: Wie soll denn ein Trader erzeugt werden, wenn als Basisklasse eine Person benötigt wird, die wiederum einen Trader benötigt? Ich muss zugeben, dass ich in C++ nicht mehr ganz drin bin, meines Verständnisses nach geht das nicht.

Selbst wenn das irgendwie kompiliert werden könnte, stellt sich immer noch die Designfrage. Ich würde vermutlich eher eine gemeinsame Basisklasse nehmen.

Implementiere die Methoden nicht innerhalb der Klassendefinition, sondern trenne das sauber in .h (Klassendefinitoin) und .cpp (Methodendefinitionen) auf.

Dass eine Klasse ein Freund ihrer eigenen Basisklasse ist, halte ich übrigens für einen Designfehler. Dafür gibt es private, protected und public.

  • 3 Wochen später...

funktionieren sollte es, wenn du eine virtuelle (?) Methode in der Elternklasse schreibst und diese dann in der Kindklasse überschreibst. So würde ich es wenn dann machen.

Da ich seit längerem nicht mehr so intensiv mit Vererbung gearbeitet habe muss ich sagen: Alles ohne Gewehr (*Peng*)!

edit: ghaa nich gesehen, dass das Thema schon a Monat alt is >_<'

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.