Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 32 из 87<  1 ... 29  30  31  32  33  34  35 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Daemon А что, сишные функции генерируют исключения? Или это прикол? :spy:



Партнер
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Билли Бонс это виндовый SEH. Генерирует ОС, когда будешь читать не тот кусок памяти.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
А-а. :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Вопросик такой, у себя в программе определяю простые структуры-классы, типа точка, для своих внутренних целей:
Код:
struct SPoint
{
   SPoint (float _x, float _y)
   {
      x = _x;
      y = _y;
   }
   SPoint ()
   {
   }
   float x, y;
};

Или там, набор точек. Но я использую библиотеку QT, в которой, например, уже есть класс QPoint. Мне как, лучше использовать его и не городить своих структур, или делать свой класс из соображений эффективности?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman о какой эфективонсти речь? :) Пара сэкономленных байтов? А эфективность кода как?

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Все-таки решил юзать свой класс точки по одной простой причине - в классе QPoint на координаты были навешаны геттер и сеттер, вместо простого объявления пабликом. А это не совсем-то и удобно, в данном случае(тем более сеттер никак не проверяет входные данные). В общем как мне кажется нельзя строго придерживаться каких-либо правил, ведь и они могут выходить за рамки разумности.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ты же сам понимаеш, чем грешит твой класс, как раз тем, чего тебе не хватало от QT. Поскольку это неправильно с точки зрения проектирования, именно по этому этого нет в QT.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Не согласен. Принцип инкапсуляции как я понял нужен для того, чтобы пользователь класса не смог отрицательно повлиять на его работу, поэтому данные члены скрываются, а в интерфейсе делают эти самые геттеры и сеттеры. Зачем? Сеттер нужен для того, чтобы отсечь нежелательные значения и к примеру изменить внутреннее состояние объекта, которое возникает при смене этого нашего значения. Но, в классе точка это все совершенно неуместно, здесь всего 2 поля, x и y, которые полностью зависят от пользователя класса, в функции сеттера никаких условий на входные данные не применяется, то есть здесь инкапсуляция совершенно неуместна. Я так считаю. Зачем слепо следовать каким-то правилам, невзирая на обстоятельства?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman либо используй ООП и действую по правилам ООП, либо используй элементы структурного программирования. Ты здесь соорудил non-POD тип, и хочешь им пользоватся как обычной С-структурой. Если брать конкретно даннуж ситуацию - да не столь важно конечно, но это плохой стиль.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Вот в этом-то и дело, в конкретной структуре. Правила ООП - это же не догма и слепо применять их всюду и вся ИМХО, неверно. Даже в какой-то статье недавно видел, как какой-то известный программист выступил по поводу этой самой догматичности, и, точно не помню, как раз упомянул эти самые геттеры и сеттеры, что поголовно применять их тоже не стоит.
Как мне кажется, плохой стиль - не применять ООП, когда это действительно нужно, для каких-то сложных объектов, стараюсь в этом случае делать максимально по правилам. Но в данном конкретном случае, ИМХО, это просто вопрос удобства:
Код:
dx = pt1.x-pt2.x;
pt1.x=5;

Или так
Код:
dx=pt1.x()-pt2.x();
pt1.setX(5);

Мне кажется 2й вариант менее удобен, хотя бы потому что писать больше приходится, а функционально он ничего не несет. Точка в конце концов это всего лишь точка), а не какая-то сложная система))
Добавлено спустя 1 минуту, 29 секунд
Daemon
А кстати вообще какая разница между class и struct? Так до конца и не понял. Отличаются только наследованием и полиморфизмом?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman писал(а):
кстати вообще какая разница между class и struct? Так до конца и не понял. Отличаются только наследованием и полиморфизмом?
А что там с полиморфизмом? Структура, это тот же класс, с открытыми по-умолчанию членами, и наследование по-умолчанию тоже открытое.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman
Всё зависит от того, какую смысловую нагрузку ты вкладываешь в этот класс. Если это просто точка и ничего больше, то заморачиваться с геттерами-сеттерами может и не стоит. Но если, к примеру, эту точку при изменении координат нужно перерисовывать или пересчитывать кешированную площадь полигона (точка - вершина) или ещё что-то вроде этого, то здесь без сеттеров никуда. А теперь представь, что у тебя весь код захардкоден на прямой доступ к координатам, а тебе нужно реализовать какую-то функциональность вроде вышеперечисленных... :) Придётся всё переделывать, а вот если ты уже следуешь ОО-стилю и используешь геттеры-сеттеры, то никаких проблем: поменял сеттер, сделал при необходимости его виртуальным и всё.

З.Ы. Если так напрягает синтаксис сеттеров, рекомендую посмотреть в сторону реализации свойств.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Окей.
Проблема возникла, объявляю в каком-то заголовочном файле, например stdafx.h слдеующее:
Код:
enum StartPoint { first, last };

Затем объявляю в другом заголовочном файле новый класс и объявляю там функцию:
Код:
#include "stdafx.h"
class Contour
{
...
void myfunc(StartPoint starter = first);
}

Выскакивает ошибка : error C3867: 'Contour::first': function call missing argument list; use '&Contour::first' to create a pointer to member
Пробовал и так:
Код:
   void myfunc(StartPoint starter = StartPoint::first);

Компилятор вообще падает, выдает fatal error C1001: An internal error has occurred in the compiler.
В чем может быть дело?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman гы, читай ошибки компайлера. В первом случае он подумал, что ты подсунул ему класс, определенный где-то и предложил зделать указатель на класс (это в случае, когда есть предварительное объевление). Короче в первом случае нужно зделать Rebuild проекту, и программа увидит твой тип.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Сделал ребилд, ничего не изменилось)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman что я неправильно делаю?
Код:
enum StartPoint
{
   first,
   last
};

class Contour
{
public:
   void myfunc(StartPoint starter = first);
};

void Contour::myfunc(StartPoint starter)
{
   //Bla bla bla
}


Компайлер:
Код:
dimas-computer:~ dima$ gcc -v
Using built-in specs.
Target: i686-apple-darwin8
...
gcc version 4.0.1 (Apple Computer, Inc. build 5363)

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
целиком в одном файле код? Я тоже в 1 засунул, он мне выдал куча ошибок такого вида:
error LNK2005: "public: void __thiscall Contour2::myfunc(enum StartPoint)" (?myfunc@Contour2@@QAEXW4StartPoint@@@Z) already defined in contour.obj map.obj
Хотя я переименовал этот класс в contour2, че-то непонятные глюки. Ошибка пропадает, только если засунуть реализацию во внутрь класса. А так ошибка с enum пропадает, если объявлять enum и класс в одном и том же заголовочном файле. странно почему?
Добавлено спустя 12 минут, 15 секунд
И кстати, такой еще вопрос - разные объявления, общие для многих частей программы я кидаю в 1 файл - stdafx.h - там и константы, и некоторые функции, там же я делаю #include <math.h> - это вообще хороший стиль или нет?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman это в cpp файле, нельзя делать Definition (касается также и не статических функций) в заголовочном файле и включать его в несколько срр файлов, запомни это. Вообще ищи ошибку. Либо у тебя перекрестное включение где-то, либо h фаил с enum включен после объявления класса, ну и в том же духе.
kexman писал(а):
такой еще вопрос - разные объявления, общие для многих частей программы я кидаю в 1 файл - stdafx.h - там и константы, и некоторые функции, там же я делаю #include <math.h> - это вообще хороший стиль или нет
С пару твоих слов сложно понять, что ты туда включаешь. Вообщем по вопросам инклудов написано у Страуструпа хорошо.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Да и кстати в заголовочном файле не получается делать функции обычные, можно только объявив их inline. И кстати, написано inline увеличивает скорость, за счет прямой подстановки - так что, надо поголовно все функции объявлять inline?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman я же говорю не статические функции, т.е. статические можно реализовывать и в хедере. И что мешает тебе делать объявление в h файле, и реализовывать их в срр файле?

_________________
Ку ку


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 32 из 87<  1 ... 29  30  31  32  33  34  35 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan