Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2013, 22:31   #11
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Sergius X,

Код:
class CClass {
  private:
    int array[9];
  public:
    getItemAt(const int id) { return array[id]; }
    setItemAt(const int id, const int value) { array[id] = value; }
    __declspec(property(get=getItemAt, put=setItemAt)) int Item[const int id];
};
методы доступа в private пишутся. И это не динамический массив. Это не то что нужно
$ergius
Sergius X вне форума Ответить с цитированием
Старый 29.07.2013, 22:35   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
методы доступа в private пишутся
если в delphi тоже, то и bcb. в visual нет.

Цитата:
И это не динамический массив
Я привёл пример тупо массива, сделать динамически нетрудно.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 29.07.2013, 22:36   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Да, я понимаю, и Вы абсолютно правы. Просто автор хотел собственную реализацию.
Автору стоит пожелать научиться грамотно формулировать свои мысли.
Не понятно, чего он хочет.
_Bers вне форума Ответить с цитированием
Старый 29.07.2013, 23:22   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
методы доступа в private пишутся.
с чего это вдруг они обязаны быть приватными?
просто принято их инкапсулировать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2013, 11:21   #15
Sergius X
Пользователь
 
Регистрация: 21.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Не понятно, чего он хочет.
Я же привел пример своей попытки, мне нужна подобная конструкция, что бы я мог работать с этим массивом, как с обычным полем

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Я привёл пример тупо массива, сделать динамически нетрудно.
В том то и трудность, что я не могу собрать все в кучу, что бы это корректно работало для динамического массива
$ergius

Последний раз редактировалось Sergius X; 30.07.2013 в 11:23.
Sergius X вне форума Ответить с цитированием
Старый 31.07.2013, 01:41   #16
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Вот держи, я тут накидал простенький костыль.
Код:
#include <stdio.h>


// Аллокатор
template<typename T>
struct myAlloc {

    static T*  get_alloc(size_t n) {
          T* p;
          try {
             p = new T[n];
          } catch(...) {
             return NULL;
          }
          return p;
    }

    static void dispose(T*& p) {
         if(p != NULL)
              delete[] p;
         p = NULL;
    }

    // память выделяется блоками, можешь указать оптимальный собственный размер 
    static size_t get_block(void) {
          return 32u;
    }
};







// динамический массив
template<typename T, typename Alloc = myAlloc<T> >
class  myArray {
private:
     T*      p;
     size_t  n;
     size_t  m;
public:
     myArray(void) : p(NULL), n(0u), m(Alloc::get_block()){}

     explicit myArray(const myArray& o) 
       : p(NULL), n(0u), m(Alloc::get_block()) {
          this->Copy(o);
     }

     ~myArray() {
          this->Clear();
      }


     // добавление
     void  Add(const T& v) {
          if(p == NULL) {
              if((p = Alloc::get_alloc(m)) == NULL)
                   return;
          }

          if(n >= m) {
              m   += Alloc::get_block();
              T* t = Alloc::get_alloc(m);
              if(t == NULL)
                   return;

              for(size_t i = 0u; i < n; i++)
                   t[i] = p[i];
              Alloc::dispose(p);
              p = t;
           } 
           p[n++] = v;
     }


     // копирование 
    void Copy(const myArray& o) {
        if(o.Empty()) 
             return;

        if(o.GetSize() > n) {
            this->Clear();
            if((p = Alloc::get_alloc(o.GetSize())) == NULL)
                 return;
        }
        for(size_t i = 0u; i < o.GetSize(); i++)
             p[i] = o[i];
        n = o.GetSize();
    }


    // удаление отрезка с first до last позиции за O(n)
    void  Delete(size_t f, size_t l) {
        if((p == NULL) || (! n) || (l > n))
             return;

        size_t c = l - f;
        for(size_t k = f; k < (n - c); k++) 
             p[k] = p[k + c];
        n -= c;
    }


    inline T& operator [] (size_t i) {
        return p[i];
    }


    inline T& operator [] (size_t i) const {
        return p[i];
    }


    myArray& operator = (const myArray& o) {
        this->Copy(o);
        return *this;
    }

    // размер
    size_t GetSize(void) const {
        return n;
    }


    bool Empty(void) const {
        return ((p == NULL) || (! n));
    }

    // удаление массива из памяти
    void Clear(void) {
        if(p != NULL)
             Alloc::dispose(p);
        n = 0;
        m = Alloc::get_block();
     }

};






// ...
int  main(void) {

        myArray<int> arr;

	for(int j = 1; j < 30; j++)
		arr.Add(j);

	// удалить элементы с 10-ой по 20-ой позиции
	arr.Delete(9, 20);

	// вывести 1-ый и последний элемент
	printf("first = %d\tlast = %d\n", arr[0], arr[arr.GetSize() - 1]);


	myArray<int> b(arr);
	for(size_t i = 0u; i < b.GetSize(); i++)
		printf("%d\n", b[i]);

	b.Clear();
	arr.Clear();
	return 0;
}
Проверка кода: http://codepad.org/cR9gdgHk
Nuklon вне форума Ответить с цитированием
Старый 31.07.2013, 01:54   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

примените вектор, он за вас всю память выделит.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать метод класса, возвращающий объекты (поля класса) разных типов frosich Общие вопросы Delphi 3 01.03.2013 19:29
Как из простого мемо записать в поле БД Access в поле тоже типа мемо с сохранением всех абзацев пробелов Speeker БД в Delphi 2 28.11.2011 16:22
Ошибка при реализации метода класса, имеющего поле шаблоннного типа. DKOI Общие вопросы C/C++ 5 19.10.2010 19:10
объекты класса и динамические массивы alex_alpha Общие вопросы C/C++ 14 11.06.2010 01:32
Static поле класса GenAcid Общие вопросы Delphi 2 17.06.2008 11:55