Или там, набор точек. Но я использую библиотеку QT, в которой, например, уже есть класс QPoint. Мне как, лучше использовать его и не городить своих структур, или делать свой класс из соображений эффективности?
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? Так до конца и не понял. Отличаются только наследованием и полиморфизмом?
kexman Всё зависит от того, какую смысловую нагрузку ты вкладываешь в этот класс. Если это просто точка и ничего больше, то заморачиваться с геттерами-сеттерами может и не стоит. Но если, к примеру, эту точку при изменении координат нужно перерисовывать или пересчитывать кешированную площадь полигона (точка - вершина) или ещё что-то вроде этого, то здесь без сеттеров никуда. А теперь представь, что у тебя весь код захардкоден на прямой доступ к координатам, а тебе нужно реализовать какую-то функциональность вроде вышеперечисленных... Придётся всё переделывать, а вот если ты уже следуешь ОО-стилю и используешь геттеры-сеттеры, то никаких проблем: поменял сеттер, сделал при необходимости его виртуальным и всё.
З.Ы. Если так напрягает синтаксис сеттеров, рекомендую посмотреть в сторону реализации свойств.
Выскакивает ошибка : error C3867: 'Contour::first': function call missing argument list; use '&Contour::first' to create a pointer to member Пробовал и так:
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
kexman гы, читай ошибки компайлера. В первом случае он подумал, что ты подсунул ему класс, определенный где-то и предложил зделать указатель на класс (это в случае, когда есть предварительное объевление). Короче в первом случае нужно зделать Rebuild проекту, и программа увидит твой тип.
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 файле, и реализовывать их в срр файле?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения