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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL, классы и преобразования 
V
    Опции темы
ButtonOFF
Дата 3.2.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Есть класс

Код

class MyClass
{
public:
MyClass(){};
~MyClass(){};
private:
int a;
};


Есть код

Код

MyClass * class;
std::list<MyClass> * list;

list = new std::list<MyClass>;
...
for (int i=0; i<5; i++)
{
  class = new MyClass;
  ...
  // заполняем класс
  ...
  list.pushback(class);
}
...
while(true)
{
   class = list.pop_front();
   // что то с ним делаем
}


Компилятор ругается 
Код

error C2664: std::list<_Ty>::push_back: невозможно преобразовать параметр 1 из 'MyClass *' в 'const MyClass &'

Как преобразовать в const?
PM MAIL   Вверх
Artemon
Дата 3.2.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Код

std::list<MyClass> * list;

list = new std::list<MyClass>;



to

Код

std::list<MyClass*> * list;

list = new std::list<MyClass*>;



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bsa
Дата 3.2.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



во-первых, ключевое слово "class" нельзя использовать в качестве переменной.
во-вторых, ты обратил внимание не на то, на что следовало. list у тебя содержит объекты типа MyClass, а ты пытаешься в него запихнуть указатель. Думаю, тебе в строке 2 надо добавить звездочку после MyClass.
PM   Вверх
ButtonOFF
Дата 3.2.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Эх поставил бы плюсики, но постов мало.
Спасибо.

Добавлено @ 12:08
А можно ли переопределить какой-нибуть метод контейнера или добваить свой вообще? Хотелось сделать так, что удаляя указатель из контейнера, вызывался деструктор по этому указателю, т.е 

Код

list<MyClassl*>::iterator i;
delete (*i);


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


Эксперт
****


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

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



нельзя. но ты можешь воспользоваться умными указателями, которые сделают это за тебя: std::shared_ptr (доступен в C++11) или boost::shared_ptr
PM   Вверх
volatile
Дата 4.2.2012, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ButtonOFF @  3.2.2012,  12:03 Найти цитируемый пост)
Эх поставил бы плюсики, но постов мало.

Сделано
PM MAIL   Вверх
ButtonOFF
Дата 12.2.2012, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Помогите еще с 1 задачей.
Стоит задача загрузить файлы в память, файлы представляют собой набор структур, однако мне нужен быстрый доступ к содержимому этих файлов, а так же быстрый поиск, не много подумав решил использовать контейнер map, примерно такого типа
Код
pair<char, MyClass*> MyClass - класс который создается из файла

Объясню почему, первая чать - ключ - имя файла, т.к это удовлетворяет моим условиям, и искать будем именно по названию загруженного файла. Вторая часть указатель на класс, с ним проблем вообще нет.
И так, сразу же пришлось переделать в 
Код
pair<char*, MyClass*>

но здесь опять были подводные камни... код должен все объяснить
Код

map<char*, MyClass*> m;
map<char*, MyClass*>::iterator it;

MyClass * myClass = new MyClass;

char * c = "Имя_файла";
char * a = new char[20];
ZeroMemory(a, 20);

memcpy(a, c, strlen(c));

m.insert(pair<char*, MyClass*>(c, myClass));
it = m.find(c); // отрабатывает как и надо
it = m.find(a); // здесь ошибка it возвращает m.end()


Контейнер менять не хочу, т.к имеет быстрый поиск. 
Еще прикол в том, что
Код

it = m.find("Имя_файла");

находит запись

Это сообщение отредактировал(а) ButtonOFF - 12.2.2012, 18:48
PM MAIL   Вверх
volatile
Дата 12.2.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



У вас в коде не так как вы привели. Так должно работать, (хотя смысла нет по любому smile ).

m.insert(pair<char*, MyClass*>(c, myClass));
"с" заменить на "а"

И самое главное. Раз вы во-всю используете СТЛ, так почему не используете стд::стринг?
PM MAIL   Вверх
ButtonOFF
Дата 12.2.2012, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



Цитата(volatile @ 12.2.2012,  19:01)
У вас в коде не так как вы привели. Так должно работать, (хотя смысла нет по любому smile ).

m.insert(pair<char*, MyClass*>(c, myClass));
"с" заменить на "а"

И самое главное. Раз вы во-всю используете СТЛ, так почему не используете стд::стринг?

Код

map<char*, MyClass*> m;
map<char*, MyClass*>::iterator it;

MyClass * myClass = new MyClass;

char * c = "Имя_файла";
char * a = new char[20];
ZeroMemory(a, 20);

memcpy(a, c, strlen(c));

m.insert(pair<char*, MyClass*>(a, myClass));
it = m.find(c); // ошибка
it = m.find("Имя_файла"); // ошибка

Так вообще не находит  smile 

Стринг не использую из-за проблем конвертирования string <-> char
PM MAIL   Вверх
volatile
Дата 12.2.2012, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ButtonOFF, извини не посмотрел даже. так вообще нельзя делать.

У вас мап использует ключом указатель, т.е он сравнивает указатели, а не строки.

Короче перепешите с использованием std::string.
Цитата(ButtonOFF @  12.2.2012,  19:10 Найти цитируемый пост)
Стринг не использую из-за проблем конвертирования string <-> char 

Какие проблемы? никаких проблем не должно быть.
PM MAIL   Вверх
ButtonOFF
Дата 12.2.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



volatile,  Ясно, просто мало где пишут какие типы можно использовать.
Проблема перевести из чар в стринг smile 
PM MAIL   Вверх
volatile
Дата 12.2.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну если стринг ни в какую нельзя, тогда нужно написать свой предикат сравнения, выбирайте
PM MAIL   Вверх
volatile
Дата 12.2.2012, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ButtonOFF @  12.2.2012,  19:33 Найти цитируемый пост)
Проблема перевести из чар в стринг   

const char * c = "Имя_файла";
std::string str = c;

PM MAIL   Вверх
ButtonOFF
Дата 12.2.2012, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


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

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



volatile,  Нет, попробовать думаю стоит, всеравно мало где будет использоватся, да и самое главное что для поиска достаточно m.find("Имя_файла") (только что попробовал).

volatile, все ясно  smile  спасибо.

Это сообщение отредактировал(а) ButtonOFF - 12.2.2012, 19:40
PM MAIL   Вверх
bsa
Дата 13.2.2012, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




 ! 
bsa
Народ, когда вместо кого-то ставите + или - в репу, то проверяйте, не поставил ли уже кто-то до вас!
а то у меня уже 3 плюса за одно и тоже
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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