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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ к закрытым данным класса 
:(
    Опции темы
blackofe
Дата 19.1.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(zss @ 19.1.2006, 10:45)
есть чисто виртуальный класс
Код
class Base{
  virtual f(...) const = 0;
};

терминология! smile

есть чисто виртуальные методы (pure virtual method).

есть абстрактные классы.

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

Это сообщение отредактировал(а) blackofe - 19.1.2006, 20:08
PM MAIL   Вверх
zss
Дата 19.1.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vyacheslav @ 19.1.2006, 18:07 Найти цитируемый пост)

Шаг второй. Добавляем в A protected медоды, которые будут принимать в качестве параметра экземпляры классов и возвращать ссылки(указатели) на нужные нам закрытые поля. Вторая часть задачи выполнена

что-то не совсем понял smile
PM MAIL ICQ   Вверх
blackofe
Дата 19.1.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(zss @ 19.1.2006, 10:45)
и наконец общий класс, являющийся вектором А
Код
class Result : std::vector <A> {
private :
  Base *base_;

public:
  Result (const Base& base) : base_ (&base){...}
}

smile

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

STL вообще не предназначена для того, чтобы на ее основе строить свои иерархии. большей частью это инструментальная библиотека. организовать коллекцию своих объектов, воспользоваться эффективным алгоритмом, использовать удобные типы данных вроде строк и потоков - вот основные ее назначения. но STL - не объектно-ориентированная библиотека! читайте форум.
PM MAIL   Вверх
Vyacheslav
Дата 20.1.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zss @ 19.1.2006, 21:26)

что-то не совсем понял smile

Примерно так
Код

Сlass Ai;
class Result;
class Base 
{

 public:  
    Base(){}
    void virtual print() = 0;
    void setAi( Ai* value) {
        m_ai = value;
    }
    void setResult( Result* value) {
       m_result =value;
   }
   virtual ~Base(){}

 protected:
     int getAiValue();
     string getResultName();
    Result* m_result;
    Ai* m_ai;          
};


class Ai {
   public:
       Ai( int value) :m_value(value) {}
   private:
      int m_value;
   friend class Base;  
};

class Result : public std::vector <Ai> {
  private :
     Base* base_;
     string m_name;
  public:
     Result (Base& base, const string& name ) : base_ (&base), m_name(name)
     {
        base_->setResult(this);
     }
     void print()
     {
       base_->print();
     }
   friend class Base;
} ;

int Base::getAiValue() {
    if( !m_ai) {
       throw exception("m_ai is NULL");
   }
    return m_ai->m_value;
}

string Base::getResultName()
{
   if( !m_result) {
       throw exception("m_result is NULL"); 
   }
    return m_result->m_name;
} 

class Derived : public Base 
{
public:
     void print() 
     {
        cout << getResultName() << endl;
        for(Result::iterator i = m_result->begin(); i < m_result->end(); i++ ) {
            setAi( i );
            cout << getAiValue() << ";";
        }
     }
};

int main(int argc, char* argv[])
{
    Derived  b;
    Result r(b, "test" );
    r.push_back(Ai(1));
    r.push_back(Ai(2));
    r.push_back(Ai(3));
    r.push_back(Ai(4));
    r.print();

    return 0;
}


А вообще, если для одного класса требуется доступ к приватным членов двух другиз классов, я бы задумался над правильностью дизайна
Добавлено @ 12:29
Цитата(blackofe @ 19.1.2006, 21:31)
создавать наследников из классов STL - очень и очень плохая практика.
но STL - не объектно-ориентированная библиотека! читайте форум.

ООП зиждится на понятиях класса и объекта, а также трех основных парадигмах - наследование, инкапсуляция, полиморфизм. В STL есть классы, на основе которых создаются объекты, есть наследование и инкапсуляция. Неужели только из-за того, что там не использованы виртуальные деструкторы, Вы отказываете ей в объектно-ориентированности?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.1.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Vyacheslav @ 20.1.2006, 12:21 Найти цитируемый пост)

ООП зиждится на понятиях класса и объекта, а также трех основных парадигмах - наследование, инкапсуляция, полиморфизм. В STL есть классы, на основе которых создаются объекты, есть наследование и инкапсуляция.

А также есть статический полиморфизм ...



--------------------
...
PM   Вверх
blackofe
Дата 20.1.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Vyacheslav @ 20.1.2006, 12:21)
ООП  зиждится на понятиях класса и объекта, а также трех основных парадигмах  - наследование, инкапсуляция, полиморфизм. В STL есть классы, на основе которых создаются  объекты,  есть наследование и инкапсуляция. Неужели только из-за того, что там не использованы виртуальные деструкторы, Вы отказываете ей в объектно-ориентированности?

во-первых, отказываю не только я. я уже приводил ссылки на этом форуме по этому поводу. ищите и обрящете.

а если в библиотеке используются слова class и конструкции типа class A : public B {};, то это еще не делает эту библиотеку объектно-ориентированной.

цитата из dr.dobb's journal за 1995 год:

While the STL is powerful, it has its limitations, the biggest being that it is not very object oriented. Object orientation depends on data and algorithms being combined under one interface. The whole premise of the STL is at odds with this: The STL separates data and algorithms, allowing their recombination in novel and useful ways.

краткий перевод:

"STL - это круто, но не объектно-ориентировано. и хотя это не объектно-ориентировано, это все-равно круто." smile
PM MAIL   Вверх
blackofe
Дата 20.1.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



если вы подписаны на ddj, то там (мартовский номер 1995 года) можно найти статью - интервью с александром степановым ("Alexander Stepanov and STL"). в ней степанов если не противопоставляет stl объектно-ориентированному программированию, то, по крайней мере, четко разделяет.

STL is an important addition to the evolution of Standard C++, not only for the rich library of container classes that it provides, but also for its insight into "generic programming," a different approach to designing and developing code.

сам степанов вот чего говорит:

Object-oriented programming aficionados think that everything is an object. When I was working on the Ada generic library, I realized that this wasn't so. There are things that are objects: Things that have state and change their state are objects. And then there are things that are not objects. A binary search is not an object. It is an algorithm. Moreover, I realized that by decomposing the component space into several orthogonal dimensions, we can reduce the number of components, and, more importantly, we can provide a conceptual framework of how to design things.

так что STL - это красиво, эффективно, но не объектно-ориентировано в строгом смысле этого слова.
PM MAIL   Вверх
Earnest
Дата 22.1.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



За 10 лет, прошедших с 1995 года представление об ООП тоже весьма изменилось.
Например, в одной из своих книг Мейерс показывает, что в интерфейс класса входят не только его методы, но и внешние функции, предоставляющие дополнительный сервис и определенные в некотором смысле "рядом" с этим классом. В этом смысле STL можно считать библиотекой контейнеров, снабженную дополнительными сервисами в виде алгоритмов.

И где в цитате Степанова написано, что STL - не объектно-ориентированная? Там написано, что она не только объектно-ориентированная. И что generic programming - методология, которая позволяет учлучшить чистую ООП-архитектуру.
Кроме того, именно STL стирает разницу между функциями и объектами: функтор - он тебе и объект и функция одновременно. Я бы сказала, что STL пропагандирует еще большую инкапсуляцию, чем принципы раннего ООП.

Но в одном ты прав: использование слова class и наследования не делает код объектно-ориентированным. Только это не про STL.



--------------------
...
PM   Вверх
zss
Дата 22.1.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тупик...

Я не знаю как быть.
Мой класс имеет вектор объектов, которые имеют собственные очереди и в собственных потока заполняют их.

Изначально я хотел передовать в этот класс, класс, который будет заниматься обработкой.
Но это приводит к усилению связей и раздутию класса

Нужен опытный совет

1. Можно в основном классе все очериди слить в одну (не приведет ли это к издержкам и замедлению работы - скорости довольно большие)
2. можно не передовать класс обработки, но тогда нужен будет интерфейс к каждому внутреннему объекту, что не хотелось бы делать из-за неуниверсальности


Как лучше и правильнее поступить ?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0973 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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