Суббота, 20 Апреля 2024, 07:46

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Вопрос-Ответ (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();

Спасибо. smile

Цитата 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))
{
...
}

Пока пишешь один надо красоту искать у себя в голове. А вот когда в компании - там уж от правил никуда не деться smile

dynamic_cast делает преобразование в реал-тайме с кучей проверок


Сообщение отредактировал Saitei - Воскресенье, 08 Марта 2015, 15:42
choopieДата: Воскресенье, 08 Марта 2015, 14:55 | Сообщение # 1415
частый гость
Сейчас нет на сайте
OpenGOO, Saitei, спасибо вам большое. biggrin
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, вроде, не так страшен

Сталина в каждый дом!
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Поиск:

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