Błąd: left of -> must point to class/struct/union/generic type

0

Witam, jestem nowy w C++ i chciałem zrobić drobny projekt żeby poćwiczyć programowanie objektowe

class ClassB;
class ClassA() {
  ClassB* objekt;  // nie chce używać &objekt

  ClassA::ClassA(ClassB * objekt_konstruktor) {
    objekt = objekt_konstruktor;
    objekt->random_value++;
  }
};

class ClassB() {
  int random_value = 10;
  *classa_pointer;

  int jakas_funkcja();
};

int ClassB::jakas_funkcja() { classa_pointer = new ClassA(this); }

// probowałem też:

ClassA::ClassA(ClassB* objekt_konstruktor) : objekt(objekt_konstruktor) 

zawsze przy używaniu wskaźnika: objekt np. przy

 objekt->random_value++; 

dostaje 2 błędy:

  1. left of '->random_value' must point to class/struct/union/generic type
  2. error C2027: use of undefined type

przepraszam za gramatykę i proszę o szybką pomoc :>

0

zapomniałem jeszcze o ClassA przed *classa_pointer; ale myślę że zrozumiecie :)

3

A to się w ogóle skompiluje? Bo masz tylko deklaracje zapowiadającą B (czyli nie wiadomo co ta klasa zawiera) potem w kodzie w A próbujesz używać pól i metod z B (co jest niemożliwe bo kompilator ich nie zna!) a dopiero potem definiujesz B. Generalnie w takiej sytuacji oddziela się kod do pliku *.cpp a w nagłówkach są tylko sugnatury.

0

Wiem to tylko chodzi o szkic żebyście zrozumieli o co mi chodzi
mi chodzi o to że kiedy wszystko jest połączone to coś źle idzie z definicją wskaźnika w konstruktorze klasy A

1

Przeglądając na polski: @Shalom napisał, że deklaracja zapowiadająca klasy to co innego niż definicja.
Próbujesz odwołać się do obiektu klasy, która nie ma rozwinięcia.

Skoro korzystasz z C++11, korzystaj z jego dobrodziejstw i zamiast gołych new

classa_pointer = new ClassA(this);  

użyj smart pointerów (std::unique_ptr lub std::shared_ptr).

0

Zrobiłem tak jak mi mówiłeś z tym new ale problem nie leży w konstrukcji tylko w inicjalizacji w konstruktorze :<

a propos próbowałem też z unique_ptr ale chciałem zrobić tabele objektów a jakoś nie rozumiem jak to działa xd

2
class ClassB;
class ClassA
{
  ClassB* objekt;  // nie chce używać &objekt
public:
  ClassA(ClassB* objekt_konstruktor);
};
 
class ClassB
{
public:
  int random_value = 10;
  ClassA* classa_pointer;
 
  int jakas_funkcja();
};

int ClassB::jakas_funkcja() 
{ 
    classa_pointer = new ClassA(this); 
    return 0;
}

ClassA::ClassA(ClassB* o)
{
    objekt = o;
    objekt->random_value++;
}
  1. Konstruktor w tym przypadku musi być public.
  2. Ciało konstruktora występować po definicji klasy ClassB.
0

Mam tak ale to nie w tym jest problem... konstruktor jest publiczny, funkcje definiują się nawzajem ale jedyny problem to fakt że jest jakiś niezdefiniowany wskaźnik klasy ClassB

1
jedyny problem to fakt że jest jakiś niezdefiniowany wskaźnik klasy ClassB

Problem z pewnością leży gdzieś indziej, bo zrobiłeś jakiś błąd o którym nie wiesz. Ale nikt nie będzie wiedział gdzie on jest dopóki nie pokażesz całego swojego kodu.

0

btw problem na pewno nie leży poza tymi plikami bo tylko je edytowałem a pomiędzy klasą CEntity z której dziedziczą nie ma powiązania do funkcji attack_ranged()

1

Fajnie jakbyś jeszcze wkleił komunikat błędu. Generalnie zapoznaj się z tym: Dlaczego nikt nie odpowiada w moim wątku?

Ale i tak widzę tam

parent_player->addBullet();

a przecież parent_player to wskaźnik klasy CPlayer, której definicji nie znasz. Czyli to o czym pisałem parę postów wyżej.

0

Temat do zamknięcia z nudów próbowałem wszystkiego i jakoś zadziałało xD

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