Среда, 13 Ноября 2024, 10:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
нужна помощь с классами
Raf_TankДата: Среда, 01 Февраля 2017, 15:58 | Сообщение # 1
был не раз
Сейчас нет на сайте
Столкнулся с такой проблемой, что ниже стоящий класс не может использовать выше стоящий класс как тип данных, хотя я и прописал перед ним
class UpperClassName; Вот скрин для понимания.
http://s1.uploadpics.ru/images/-yCmgfdmlf.png
Подскажите пожалуйста что не так.
SaiteiДата: Среда, 01 Февраля 2017, 16:13 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата Raf_Tank ()
Подскажите пожалуйста что не так.

Проблема в том, что реализация Bullet находится снизу. Очевидно же: использование неопределённого типа "Bullet"
Raf_TankДата: Среда, 01 Февраля 2017, 17:06 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата Saitei ()

Проблема в том, что реализация Bullet находится снизу. Очевидно же: использование неопределённого типа

Это я вижу, я не совсем корректно поставил вопрос. Правильнее будет спросить как решить эту проблему без сдвига классов? Я вообще не изучал с++ ни в школе, ни где-либо ещё, учусь по видеоурокам. Так вот в одном из таких уроков была похожая ситуация с двумя классами, и данную проблему решили таким простым путём, как своего рода "переопределение" класса выше. Как я и сделал, над классом Player есть строка, которая якобы должна дать понять компилятору, что где-то в коде есть этот самый класс Bullet, но почему-то не работает...
GudleifrДата: Среда, 01 Февраля 2017, 17:26 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Raf_Tank, не забывайте: C++ - это только "C для убогих". То, что не работает в C, то не сработает и в C++.
Что у Вас происходит в ошибочной строчке? Компилятор пытается подставить в код операцию "зафигачить параметр". Для этого нужно знать "размер параметра", иначе "зафигачивание" не работает. Размер же "Bullet" на этот момент не известен, известно только, что это класс, а сколько в нем полей - неизвестно. В C, конечно, никакой идиот не будет пытаться передавать целиком структуру данных (а в C++ - пожалуйста), а ограничится передачей указателя. Указатель-то всегда имеет одинаковый "размер" и "зафигачивается" без проблем. Для передачи указателя на элемент класса предварительного "объявления без определения" достаточно, для передачи элемента класса целиком - нет. Тем более, что Вы не только передали элемент целиком, но и пытаетесь получить доступ к его кусочку "bx", о котором уж точно еще ничего не известно.

P.S. За пользование видеокурсами и выкладывание листинга в виде картинки надо было бы карму попортить.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Среда, 01 Февраля 2017, 20:22
dalikivugДата: Среда, 01 Февраля 2017, 20:16 | Сообщение # 5
почетный гость
Сейчас нет на сайте
тс стоит обротить внимание на C#, чтобы уменьшить последующее кол-во вопросов ^_^
LPДата: Четверг, 02 Февраля 2017, 01:22 | Сообщение # 6
частый гость
Сейчас нет на сайте
Raf_Tank, в следующий раз выкладывай код не картинкой а текстом в теге [_code]твой код[/code] без "_" перед code. И копируй код ошибки ниже.
Без сдвига классов только указателями, выложи листинг как полагается, покажут что и куда, а так - лень.

Цитата Gudleifr ()
P.S. За пользование видеокурсами и выкладывание листинга в виде картинки надо было бы карму попортить.

Вот тут согласен)

Цитата dalikivug ()
тс стоит обротить внимание на C#, чтобы уменьшить последующее кол-во вопросов

Не слушай его))


Сообщение отредактировал LP - Четверг, 02 Февраля 2017, 01:27
Raf_TankДата: Четверг, 02 Февраля 2017, 05:39 | Сообщение # 7
был не раз
Сейчас нет на сайте
Цитата Gudleifr ()
Размер же "Bullet" на этот момент не известен, известно только, что это класс

компилятор даже не знает что это класс, о чём говорит вторая ошибка...

Добавлено (02 февраля 2017, 05:39)
---------------------------------------------
Код

#include <iostream>
using namespace std;

class Enemy{
public:
float ex;
Enemy(float e){
ex = e;
}
};
class Bullet;
class Player{
public: float xx;
void sum(Enemy e, Bullet b){
xx = e.ex + b.bx;
cout << xx;
}

};
class Bullet{
public:
float bx;

Bullet(float b){
bx = b;
}
};

int main()
{
bool a = 1;
Enemy e1(1.25);
Bullet b1(1.75);
Player p1;
p1.sum(e1, b1);
return 0;
}

Ошибка    1    error C2027: использование неопределенного типа "Bullet"    c:\проект1\проект1\main.cpp    18    1    Проект1
Ошибка    2    error C2228: выражение слева от ".bx" должно представлять класс, структуру или объединение    c:\проект1\проект1\main.cpp    18    1    Проект1


Сообщение отредактировал Raf_Tank - Четверг, 02 Февраля 2017, 05:39
dalikivugДата: Четверг, 02 Февраля 2017, 09:41 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Так:

main.cpp


---

или так:

enemy.hpp


bullet.hpp


player.hpp


main.cpp


---

а еще лучше так

enemy.hpp


enemy.cpp


bullet.hpp


bullet.cpp


player.hpp


player.cpp


main.cpp


Сообщение отредактировал dalikivug - Четверг, 02 Февраля 2017, 09:44
Raf_TankДата: Четверг, 02 Февраля 2017, 09:50 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата Raf_Tank ()
Так:

main.cpp

---

или так:

enemy.hpp

bullet.hpp

player.hpp

main.cpp

---

а еще лучше так

enemy.hpp

enemy.cpp

bullet.hpp

bullet.cpp

player.hpp

player.cpp

main.cpp


Спасибо большое! Получилось!
GudleifrДата: Четверг, 02 Февраля 2017, 14:15 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Цитата Raf_Tank ()
компилятор даже не знает что это класс, о чём говорит вторая ошибка...
Знает, но не может ни разместиь (нет размера), ни связать с bx (нет объявления bx).

Цитата Raf_Tank ()
Правильнее будет спросить как решить эту проблему без сдвига классов?

Цитата Raf_Tank ()
Получилось!

Тот самый сдвиг классов и получился.

Добавлено (02 февраля 2017, 14:15)
---------------------------------------------
Правильнее, видимо, будет так:

Код
#include <iostream>
using namespace std;

class Thing{
public: float ex;
};

class Enemy: public Thing{
public:
Enemy(float e){
ex = e;
}
};

class Player{
public: float xx;
void sum(Thing e, Thing b){
xx = e.ex + b.ex;
cout << xx << "\n";
}
};

class Bullet: public Thing{
public:
Bullet(float b){
ex = b;
}
};

int main()
{
bool a = 1;
Enemy e1(1.25);
Bullet b1(1.75);
Player p1;
p1.sum(e1, b1);
return 0;
}


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Четверг, 02 Февраля 2017, 12:24
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг