Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП, доступ к защищенным данным класса, ООП, доступ к защищенным данным класса 
:(
    Опции темы
neondartal
Дата 20.6.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 25.11.2009

Репутация: нет
Всего: нет



Всем привет, я не смотрел есть что-то типа этого здесь или нет. Так что извините, если чего.
Частенько сталкиваюсь с такой вещью.


class a
{
public:
  a();
  int & getA() { return a;} // или так
//  int * getA() { return &a;}
private:
  int a;
};


Если бы я это видел 1 - 2 раза и этот код был написан неумелым программистом - еще ничего.
Зачем тогда обьявлять закрытые данные в классе, если через функцию этого же класса можно получить прямой доступ к данным ??? Причем добавление const в обьявлении функции getA - не имеет значения. 
Я думаю тогда не стоит такие даные делать закрытыми, так как тут получается всего лишь лишний вызов функции класса и потерянное время написания ???
Например возьмите исходники Blendera - там сплошь и рядом - такие  обьявления и реализации.
PM MAIL   Вверх
mes
Дата 20.6.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(neondartal @  20.6.2010,  22:22 Найти цитируемый пост)
Зачем тогда обьявлять закрытые данные в классе, 

для того чтоб разделить интерфейс и реализацию..
например если понадобится модернизитовать класс до такого : 
Код

class А
{    
     A_Impl *  p_impl;
 public:
     int& get () { return p_impl->get(); }
};


Цитата(neondartal @  20.6.2010,  22:22 Найти цитируемый пост)
так как тут получается всего лишь лишний вызов функции класса и потерянное время написания ???

а на что оптимизатор ?!




--------------------
PM MAIL WWW   Вверх
Earnest
Дата 21.6.2010, 07:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



По-моему, это все же дурной тон, псевдо-объектное программирование. Если уж делать доступ через функции, то 2 метода - get\set. Тогда на метод set можно навесить какую-то доп. функциональность, защитить как-то и т.д. Единственное, что можно сказать в защиту предоставления полного доступа через функцию - ее потом легче выловить в коде (поиском), если все же придет мысль переписать нормально код... 
Еще один возможный аргумент - это только макет, и дальше будет не переменная, а что-то посложнее. Функция в этом смысле дает больше возможностей, но и тогда лучше отдельные get\set. 


--------------------
...
PM   Вверх
mes
Дата 21.6.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Earnest @  21.6.2010,  06:22 Найти цитируемый пост)
Если уж делать доступ через функции, то 2 метода - get\set.

далеко не всегда в таких ситуациях у объекта к которому добираются простой тип.
здесь int приведен просто для примера.. 


Цитата(Earnest @  21.6.2010,  06:22 Найти цитируемый пост)
псевдо-объектное программирование

для случая get/set - да, бывает такое (зачастую у новичков),
 но не всегда их наличие является показателем псевдо-ООП.


Это сообщение отредактировал(а) mes - 21.6.2010, 08:36


--------------------
PM MAIL WWW   Вверх
neondartal
Дата 21.6.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 25.11.2009

Репутация: нет
Всего: нет



Насчет функции get я понял, спасибо, вдруг перед передачей ссылки надо проверить состояние передаваемого обьекта - это лучше чем функции не сделаешь, также если обьект изменил тип - тоже в функции get - это скрыть нельзя как лучше. Но я уже набросал точную схемку на бумажке перед писаниной и переделывать ничего не надо.

Псевдо ООП - как раз в точку сказано.
Я пишу плагин к майя. Все структуры данных просто завернул в классы, проще писать.
Имеется три класса Mesh, Transform, и FString.
Потом я их завернул в один класс MeshNode и начал эти классы расписывать как по учебнику.
типа того как написал выше. Просто в некоторых случаях нужен именно "прямой" доступ к данным.
Провозился много и нудно с get set и типа этого. Но пришел к выводу - если юзер - использует только dll и не имеет никакого отношения к программированию - зачем извращаться столько писать. - написал - все или через friend class ... или просто все данные сделал открытыми. У меня просто нет никакого полиморфизма и глубокого наследования чтобы реализовывать принципы ООП на 5+. 

классы :

class Mesh
{
public:
friend class MeshNode;
private:
  mdata ...;
};
class Transform
{
public:
friend class MeshNode;
private:
  tdata ...;
};
class FString
{
public:
private:
  sdata ...;
};
class MeshNode
{
public:
private:
  Mesh        mMesh;
  Transform  mTransform;
  FString      mName;  
};


Когда учился в институте - практики было маловато. Ведь написать можно полюбому - хоть с помощью правильного ООП, хоть с помощью С и структур - не важно - все равно работать будет и придраться не к чему особо наверное.
Настоящего ООП - в этом примере нет - и быть не может, и я думаю что придумывать и превращать эти классы в непсевдо-ООП - смысла нет. Может ошибаюсь. smile

Да, прямой доступ к данным нужен - в одном случае, я импортирую полигональную сетку (как назвать не знаю - называю по англ - меш, меша) - мешу с помощью библиотеки майя и классов из нее. Потом я эти данные экспортирую в свои классы - MeshNode .... 
А если использовать только свою библиотеку потом без майя - приходится
писать такую функцию и получать доступ напрямую к данным класса.
Вот например


// maya
#include "maya/MfnMesh.h"
#pragma comment (lib, "polyApi.LIB")
// mine
#include "nea/MeshNode.h"
#pragma comment (lib, "neaMesh.LIB")

using maya::MIntArray;
using nea::MIndexArray;

int ImportMeshData(MIntArray & in, MMeshNode & meshNode, FStatus * statusErr = 0)
{
    MIndexArray & out = meshNode.getMesh().mesh.getIndices();
    //MIndexArray & out = meshNode.mesh.indices // честно - неохота так делать
    size_t size = in.length();
    out.reserve(size);
    for (size_t i = 0; i < size; i++)
    {
        out.push_back(in[i]);
    }
    if ( 0 != statusErr )
        *statusErr = 0;

    return 0;
}



Либо это делать в функции класса MeshNode, но тогда библиотека майя должна быть привязана всегда, что мне точно не нужно.

Да кстати почему народ старается написать всегда свои классы контейнеров и строк, если есть std::vector, std::string, в конце концов STL Port и Boost ??? Особенно Связные списки и векторы - почти всегда свои народ пишет - но под свой выделитель памяти можно std::vrctor - настроить - как захочешь.
Правда string - слишком универсальный, причем все они работают с любыми самодельными распределителями памяти.
Я только передалал string на свой - он попроще читается - да и программируется - складывает с строками с символами с цифрами ...., также подстроку выделяет и форматирует с разным и любым количеством аргуметнов как sprintf_s().

Это сообщение отредактировал(а) neondartal - 21.6.2010, 14:16
PM MAIL   Вверх
mes
Дата 21.6.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(neondartal @  21.6.2010,  12:47 Найти цитируемый пост)
Особенно Связные списки и векторы - почти всегда свои народ пишет

не весь народ, а только велосипедисты или для обучения.. за исключением случаев когда к _продукту_ предъявляются требования, которым не соответсвует реализованное в (стандартных) библиотеках.

Добавлено через 3 минуты и 17 секунд
Цитата(neondartal @  21.6.2010,  12:47 Найти цитируемый пост)
Но я уже набросал точную схемку на бумажке 

если смогли себе написать логичную схему взаимотношений, которую прекрасно представляете - ее и реализуйте и не обращайте внимания, что некоторые делают по другому..  удачи smile



--------------------
PM MAIL WWW   Вверх
neondartal
Дата 21.6.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 25.11.2009

Репутация: нет
Всего: нет



Спасибо, надеюсь никого не обидел выражением "народ" - буду более пунктуален. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.