Вопрос-Ответ (C++)
|
|
Kornival | Дата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1 |
The Witcher
Сейчас нет на сайте
| Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.
Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
|
|
| |
daffy-doomer | Дата: Среда, 07 Января 2015, 23:19 | Сообщение # 1401 |
частый гость
Сейчас нет на сайте
| Решил
Сообщение отредактировал daffy-doomer - Четверг, 08 Января 2015, 00:26 |
|
| |
geralex | Дата: Среда, 21 Января 2015, 19:21 | Сообщение # 1402 |
участник
Сейчас нет на сайте
| Подскажите, пожалуйста, есть бинарник собранный на Visual, исходник написан на С++ MFC. Возможно как-то узнать на какой версии ОС и с какой версией SDK компилировался проект? С бином в комплекте есть файлы .pdb из него известно, что Microsoft C/C++ MSF 7.00 А вот больше информации с помощью софта можно узнать?Добавлено (21 января 2015, 19:21) --------------------------------------------- Уважаемые пользователи, уверен, что тут есть знатоки C++ нужна помощь в разборе кода и корректном его прописании. Кто может помочь, пишите в личку. (Если сложный момент, то готов оплатить.)
|
|
| |
choopie | Дата: Суббота, 07 Марта 2015, 02:46 | Сообщение # 1403 |
частый гость
Сейчас нет на сайте
| Всем привет. Я нубяра в ООП и С++, назрел вопрос.
Код #include <conio.h.> #include "TwoDShapes.h"
using namespace std;
void main(){ setlocale(LC_ALL, "RUSSIAN"); TwoDShape *shapes[6];
shapes[0] = &Triangle("прямоугольный", 8.0, 12.0); shapes[1] = &Rectangle(10); shapes[2] = &Rectangle(10, 4); shapes[3] = &Triangle(7.0); shapes[4] = &Parallelogram(12, 6); shapes[5] = &Circle(4);
for (int i = 0; i < 6; i++){ cout << "Объект представляет собой " << shapes[i]->getName() << "\n"; cout << "Площадь равна " << shapes[i]->area() << "\n"; cout << "\n"; }
_getch(); }
Код #include <iostream> #include <cstring> #define M_PI 3.14159265358979323846
using namespace std;
class TwoDShape{ double width; double height;
char name[20]; public:
TwoDShape(){ width = height = 0.0; strcpy_s(name, "неизвестно"); }
TwoDShape(double w, double h, char *n){ width = w; height = h; strcpy_s(name, n); }
TwoDShape(double x, char *n){ width = height = x; strcpy_s(name, n); }
void showDim(){ cout << "Ширина и высота составляют: " << width << " и " << height << "\n"; }
double getWidth() { return width; } double getHeight() { return height; } void setWidth(double w) { width = w; } void setHeight(double h) { height = h; } char *getName() { return name; }
virtual double area() = 0; };
class Triangle : public TwoDShape{ char style[20]; public: Triangle(){ strcpy_s(style, "неизвестно"); }
Triangle(char *str, double w, double h) : TwoDShape(w, h, "треугольник"){ strcpy_s(style, str); }
Triangle(double x) : TwoDShape(x, "треугольник"){ strcpy_s(style, "равнобедренный"); }
double area(){ return getWidth() * getHeight() / 2; }
void showStyle(){ cout << "Треугольник" << style << "\n"; } };
class Rectangle : public TwoDShape{ public: Rectangle(double w, double h) : TwoDShape(w, h, "прямоугольник"){} Rectangle(double x) : TwoDShape(x, "квадрат"){}
bool isSquare(){ if (getWidth() == getHeight()) return true; return false; }
double area(){ return getWidth() * getHeight(); } };
class Parallelogram : public TwoDShape{ public: Parallelogram(double w, double h) : TwoDShape(w, h, "параллелограм"){} Parallelogram(double x) : TwoDShape(x, "ромб"){}
bool isRomb(){ if (getWidth() == getHeight()) return true; return false; }
double area(){ return getWidth() * getHeight(); } };
class Circle : public TwoDShape{ public: Circle(double x) : TwoDShape(x, "круг"){} double area(){ return pow(getWidth(), 2) * M_PI; }
double getRadius(){ return getWidth() / 2; } };
Как мне обратиться, например, к методу getRadius наследуемого класса Circle? Для объекта в shapes[5], к примеру. :\ В main задан массив классов типа TwoDShape, и через него получается обратиться только к методам базового класса.
|
|
| |
Noterstone | Дата: Суббота, 07 Марта 2015, 06:59 | Сообщение # 1404 |
участник
Сейчас нет на сайте
| Создай объект наследуемого класса и обращайся к его методам через него.
|
|
| |
choopie | Дата: Суббота, 07 Марта 2015, 12:29 | Сообщение # 1405 |
частый гость
Сейчас нет на сайте
| Цитата Noterstone ( ) Создай объект наследуемого класса и обращайся к его методам через него. Да это я знаю, я то спрашиваю про конкретный пример кода, который я привел.
Сообщение отредактировал choopie - Суббота, 07 Марта 2015, 13:50 |
|
| |
OpenGOO | Дата: Суббота, 07 Марта 2015, 13:59 | Сообщение # 1406 |
почти ветеран
Сейчас нет на сайте
| Код std::dynamic_cast<Circle*>(shapes[5])->getRadius();
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Saitei | Дата: Суббота, 07 Марта 2015, 14:35 | Сообщение # 1407 |
старожил
Сейчас нет на сайте
| Цитата OpenGOO ( ) std::dynamic_cast<Circle*> Но желательно делать как-то не через динамик_каст, ибо он медленный =)
|
|
| |
choopie | Дата: Суббота, 07 Марта 2015, 15:02 | Сообщение # 1408 |
частый гость
Сейчас нет на сайте
| Цитата OpenGOO ( ) dynamic_cast<Circle*>(shapes[5])->getRadius(); Спасибо.
Цитата Saitei ( ) Но желательно делать как-то не через динамик_каст, ибо он медленный =)
А каким еще можно способом?
|
|
| |
OpenGOO | Дата: Суббота, 07 Марта 2015, 15:25 | Сообщение # 1409 |
почти ветеран
Сейчас нет на сайте
| Цитата Saitei ( ) Но желательно делать как-то не через динамик_каст, ибо он медленный =) Может тогда и от виртуальных функций отказаться, ведь они тоже медленные?)
choopie, в твоем случае можно и static_cast использовать. В общем изучай тему: Приведение типов
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Saitei | Дата: Суббота, 07 Марта 2015, 17:52 | Сообщение # 1410 |
старожил
Сейчас нет на сайте
| Цитата OpenGOO ( ) Может тогда и от виртуальных функций отказаться, ведь они тоже медленные?) Во-первых, от частого dynamic_cast надо убегать (ровно как и от частого прыганья по виртуальным таблицам) Во-вторых, никто не отменял полностью абстрактные методы
Если можно сразу сделать что-нибудь производительным и красивым - почему же надо городить что-то медленное? В том-то и соль. Надо метить на быстроту и красивость кода в одном флаконе. Лично я чаще всего юзаю чистые интерфейсы, у меня редко возникает необходимость в обычном virtual. Ну и виртуальное наследование это тоже тема... Но это так, к слову =)
|
|
| |
OpenGOO | Дата: Суббота, 07 Марта 2015, 22:14 | Сообщение # 1411 |
почти ветеран
Сейчас нет на сайте
| Цитата Saitei ( ) Если можно сразу сделать что-нибудь производительным и красивым - почему же надо городить что-то медленное? Если программа достаточно простая, то можно и так, только зачем, если это не повлияет на конечный результат.
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Saitei | Дата: Суббота, 07 Марта 2015, 22:42 | Сообщение # 1412 |
старожил
Сейчас нет на сайте
| Цитата OpenGOO ( ) Если программа достаточно простая, то можно и так, только зачем, если это не повлияет на конечный результат. Потому что это надо вбить себе в голову и привыкать к этому. Хуже будет, если научиться быдлокодить и с мыслями "ну и х** с ним, работать будет же!" писать что-либо
|
|
| |
OpenGOO | Дата: Воскресенье, 08 Марта 2015, 01:14 | Сообщение # 1413 |
почти ветеран
Сейчас нет на сайте
| Не надо заботиться о производительности там, где это не требуется и вот это новичкам надо вбивать. И тогда может быть быдлокода станет чуть меньше.
Кстати, чем такой код Код if (pb->type == Base::e_t2) { auto p = static_cast<T2*>(pb); ... }
красивее чем вот этот? Код if (auto p = dynamic_cast<T2*>(pb)) { ... }
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
Сообщение отредактировал OpenGOO - Воскресенье, 08 Марта 2015, 01:25 |
|
| |
Saitei | Дата: Воскресенье, 08 Марта 2015, 12:27 | Сообщение # 1414 |
старожил
Сейчас нет на сайте
| Цитата OpenGOO ( ) Не надо заботиться о производительности там, где это не требуется и вот это новичкам надо вбивать. И тогда может быть быдлокода станет чуть меньше. я же сказал: красота и производительность в одном флаконе. Цитата OpenGOO ( ) Кстати, чем такой код Код if (pb->type == Base::e_t2) { auto p = static_cast<T2*>(pb); ... }
красивее чем вот этот? Код if (auto p = dynamic_cast<T2*>(pb)) { ... } Пока пишешь один надо красоту искать у себя в голове. А вот когда в компании - там уж от правил никуда не деться
dynamic_cast делает преобразование в реал-тайме с кучей проверок
Сообщение отредактировал Saitei - Воскресенье, 08 Марта 2015, 15:42 |
|
| |
choopie | Дата: Воскресенье, 08 Марта 2015, 14:55 | Сообщение # 1415 |
частый гость
Сейчас нет на сайте
| OpenGOO, Saitei, спасибо вам большое.
|
|
| |
OpenGOO | Дата: Воскресенье, 08 Марта 2015, 15:51 | Сообщение # 1416 |
почти ветеран
Сейчас нет на сайте
| Цитата Saitei ( ) dynamic_cast делает преобразование в реал-тайме с кучей проверок Вот что сам автор языка пишет Цитата It is clear that dynamic_cast can be efficiently implemented. All that is involved are a few comparisons of type_info objects representing base classes; no expensive lookups or string comparisons are needed.
Цитата Where possible, use the safer dynamic_cast
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
gansterm | Дата: Среда, 08 Апреля 2015, 19:08 | Сообщение # 1417 |
частый гость
Сейчас нет на сайте
| Здравствуйте, возник вопрос по классам: Есть класс object, а в main у меня объявлен вектор vector<object*> objects. Как можно поместить созданный объект сразу в вектор, я хочу чтобы при создании object в блоке создания object::object() он сам себя пихал в вектор. Пытался сделать так: extern vector<object*> objects; но выдает ошибки. Как можно сделать так, чтобы object сам записывался в вектор.
|
|
| |
pelmenka | Дата: Среда, 08 Апреля 2015, 19:54 | Сообщение # 1418 |
Драгоценный Тунеядец
Сейчас нет на сайте
| Зачем тебе пихать указатель на объект в вектор? Код objects.push_back(this);
Сталина в каждый дом!
|
|
| |
gansterm | Дата: Среда, 08 Апреля 2015, 20:24 | Сообщение # 1419 |
частый гость
Сейчас нет на сайте
| Цитата pelmenka ( ) Зачем тебе пихать указатель на объект в вектор? Код
objects.push_back(this); Я про это знаю, просто у меня object родитель для других классов, и создаваться будут много и часто. Вот я и подумал зачем после каждого создания вызывать push_back. А так бы во время создания он бы сам помещался.
|
|
| |
pelmenka | Дата: Среда, 08 Апреля 2015, 21:41 | Сообщение # 1420 |
Драгоценный Тунеядец
Сейчас нет на сайте
| Можно список использовать, там push_back, вроде, не так страшен
Сталина в каждый дом!
|
|
| |