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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача параметров chars[] 
:(
    Опции темы
маерсон
Дата 11.10.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть код:
Код

char array[2];
array[0] = 1;
array[1] = 2;

Пытаюсь передать array в контруктор класса 
Код

ClassResult(const char* ar) : arr(ar)
{
 //
}
 
в качестве параметра. ClassResult Result(array). Но на счет правильности сомневаюсь. Можно ли передать ссылку на array? Если нет, то как потом высвободить память от переданного указателя?

Это сообщение отредактировал(а) маерсон - 11.10.2009, 23:51
PM MAIL   Вверх
586
Дата 12.10.2009, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Сказать сложно - непонятно, как ты этот класс используешь, и где объявлен массив array.
Я думаю, надо написать что-то вроде этого:
Код
#include <vector>

class ClassResult
{
    std::vector<int> m_data;
public:
    ClassResult(const std::vector<int> &data) : m_data(data) {}
};

int main()
{
    std::vector<int> arr(/*размер массива*/2);
    arr[0] = 1;
    arr[1] = 2;
    
    ClassResult x(arr);
}

или даже этого:
Код
#include <vector>
#include <boost/shared_ptr.hpp>

class ClassResult
{
    boost::shared_ptr<std::vector<int> > m_pData;
public:
    ClassResult(boost::shared_ptr<std::vector<int> > &pData) : m_pData(pData) {}
    void print()
    {
        for(size_t i = 0; i < m_pData->size(); ++i)
            std::cout << m_pData->at(i) << ' ';
        std::cout << std::endl;
    }
};

int main()
{
    boost::shared_ptr<std::vector<int> > ptrStdVector(new std::vector<int>(/*размер массива*/2));
    ptrStdVector->at(0) = 1;
    ptrStdVector->at(1) = 2;
    
    ClassResult x(ptrStdVector);
    x.print();
}


Это сообщение отредактировал(а) 586 - 12.10.2009, 04:58
PM   Вверх
Andrey44
Дата 12.10.2009, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Цитата(маерсон @  11.10.2009,  23:46 Найти цитируемый пост)
Пытаюсь передать array в контруктор класса 
ClassResult(const char* ar) : arr(ar)
{
 //
}

Я думаю так делать не стоит, а если вы выделите память для ar через new, что тогда?
Наверное лучше будет сделать так :
Код

ClassResult(const char* ar, size_t count) : arr(ar)
{
   size_t sz_in_byte = sizeof char * count;
   arr = new char[count];
   memcpy_s(arr, sz_in_byte, ar, sz_in_byte);
}

и дальше самому следить за удалением arr.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
маерсон
Дата 12.10.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо вам smile

Цитата

Я думаю так делать не стоит, а если вы выделите память для ar через new

то есть в вашем варианте, как бы не создавался ar(с выделением через new или без), в конструктор передается именно указатель, а не копия, и в новом классе, для высвобождения памяти, я просто могу удалить arr(в деструкторе например)?
PM MAIL   Вверх
mrbrooks
Дата 12.10.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Andrey44, а зачем arr инициализировать ar, а затем под arr все одно выделять память? как то не кошерно. 

Цитата(маерсон @  12.10.2009,  07:57 Найти цитируемый пост)
новом классе, для высвобождения памяти, я просто могу удалить arr(в деструкторе например)? 

необходимо.
PM MAIL   Вверх
Andrey44
Дата 12.10.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Цитата(mrbrooks @  12.10.2009,  08:11 Найти цитируемый пост)
Andrey44, а зачем arr инициализировать ar, а затем под arr все одно выделять память? как то не кошерно.

Ошибки копи-пейста smile недосмотрел
Вот так
Код

ClassResult(const char* ar, size_t count)
{
   size_t sz_in_byte = sizeof char * count;
   arr = new char[count];
   memcpy_s(arr, sz_in_byte, ar, sz_in_byte);
}



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
маерсон
Дата 12.10.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А по поводу удаления. Сейчас:
Код

...
char* arr = new char[count];
...

Тогда и удалять в деструкторе нужно:
Код

...
delete[] arr;
...

Верно?

Это сообщение отредактировал(а) маерсон - 12.10.2009, 09:40
PM MAIL   Вверх
zim22
Дата 12.10.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(маерсон @  12.10.2009,  09:35 Найти цитируемый пост)
Верно?

да


--------------------
PM MAIL   Вверх
bsa
Дата 12.10.2009, 11:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



маерсон, для этих целей есть уже готовые решения - std::string и std::vector<char>. Зачем изобретать велосипед?
PM   Вверх
маерсон
Дата 12.10.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa,  это все полученные данные из сокета. Но, если взглянуть с этой стороны, то будет так:
Код

char array[128];
...
ClassResult(array);
...
...
std::string str;
// Конструктор
ClassResult(const char* ar) : str(ar)
{
  //
}

// Деструктор
~ClassResult()
{
  str.clear();
}

Вроде никаких указателей и копий. Нигде не ошибся? 

Это сообщение отредактировал(а) маерсон - 12.10.2009, 15:37
PM MAIL   Вверх
zim22
Дата 12.10.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(маерсон @  12.10.2009,  15:32 Найти цитируемый пост)
Нигде не ошибся?

разве что здесь:
Цитата(маерсон @  12.10.2009,  15:32 Найти цитируемый пост)
ClassResult(const char* ar) : str(ar)

в str мы передаём данные из сокета, так? но str - это класс-строка, которому передаётся char*.
т.е. данные могут быть обрезаны, если встретится символ '\0'



--------------------
PM MAIL   Вверх
маерсон
Дата 12.10.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



zim22, а как быть тогда?
PM MAIL   Вверх
zim22
Дата 12.10.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(маерсон @  12.10.2009,  15:49 Найти цитируемый пост)
а как быть тогда?

std::vector<char> использовать вместо std::string


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

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

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

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

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


 




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


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

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