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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2011, 21:58   #1
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию Проблемы с конструктором

Код:
class li
{
	li * next;
	int data;
	friend class table;
};

li sentinel;

li * NIL  = &sentinel;

class table
{
public:
	void Add(int);
	void Find(int);
	void Remove(int);
	li * first[97];
	table();
};
table::table()
{
	for(int i=0; i<=97; i++)
		first[i]=NIL;
}
Хочу разобраться с хэш-таблицами, решил реализовать для себя что-то простенькое, столкнулся с проблемой:
Как сделать конструктор table, чтобы он мог создавать объект под таблицу с размером, который принимает в параметрах? сейчас он просто инициализирует таблицу размером 97. Как сделать так, чтобы размер можно было задавать самому? нужно кароче конструктор вида table(int N)
Merovingian вне форума Ответить с цитированием
Старый 24.09.2011, 23:40   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Код:
class table
{
public:
        table(const unsigned size);
        ~table();
	void Add(int);
	void Find(int);
	void Remove(int);
	li * first;
};

table::table(const unsigned size)
{
        first = new li[size];

	for(unsigned i=0; i<size; i++)
		first[i]=NIL;
}

table::~table()
{
        delete[] first;
}
Еще, по-хорошему, нужно добавить проверки при выделении и освобождении памяти и проверку параметра в конструкторе, но с этим уже сами справитесь
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.09.2011, 01:39   #3
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

first[i]=NIL;
Error: отсутсвует оператор "=", соответствующий этим операндам

похоже так присваяивать нельзя, я конечно не забираюсь, тут наверное какой то тоже конструктор нужен))
Merovingian вне форума Ответить с цитированием
Старый 25.09.2011, 12:16   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Потому что мы пытаемся присвоить сущность типа li* сущности типа li.
Но в любом случай объекты, которые содержат указатели, нельзя копировать с помощью конструктора копии и operator=() по-умолчанию, нужно писать свои. Как и зачем их писать написано в книжке по С++ =))
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.09.2011, 17:43   #5
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Потому что мы пытаемся присвоить сущность типа li* сущности типа li.
Но в любом случай объекты, которые содержат указатели, нельзя копировать с помощью конструктора копии и operator=() по-умолчанию, нужно писать свои. Как и зачем их писать написано в книжке по С++ =))
Объект выделяет динамическую память, и если выполнить присваивание одного объекта к другому, то дин. память каждого из объектов будет, грубо говоря, одной областью в памяти. При вызове деструктора разнесет два объекта... Верно?
Merovingian вне форума Ответить с цитированием
Старый 25.09.2011, 17:49   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Мне показалось, что имелось в виду это:
Код:
class table
{
public:
        table(const unsigned size);
        ~table();
	void Add(int);
	void Find(int);
	void Remove(int);
	li ** first;
};

table::table(const unsigned size)
{
        first = new li*[size];

	for(unsigned i=0; i<size; i++)
		first[i]=NIL;
}

table::~table()
{
        delete[] first;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 25.09.2011, 18:43   #7
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

Мне нужно вот это.
Изображения
Тип файла: jpg хэш.jpg (25.1 Кб, 142 просмотров)

Последний раз редактировалось Merovingian; 25.09.2011 в 18:46.
Merovingian вне форума Ответить с цитированием
Старый 25.09.2011, 19:49   #8
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

сделал конструктор копирования
в классе li объявил его так
Код:
public li(const li&);
вызвать его не получается ни так
Код:
li first[i] = li(NIL);
ни так
Код:
li first[i](NIL);
Merovingian вне форума Ответить с цитированием
Старый 28.09.2011, 14:55   #9
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

ну что никто не подскажет? неужели нет знающих людей
Merovingian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать пустое окно с конструктором TwiX Visual C++ 2 18.06.2011 19:01
Проблема с конструктором igor17 Общие вопросы C/C++ 13 15.05.2011 22:23
Експеримент над конструктором Golovastik Общие вопросы C/C++ 1 03.06.2010 04:57
Что-то не так с конструктором Дырдин Общие вопросы C/C++ 7 26.03.2010 18:33
Помогите с конструктором girkoff Общие вопросы C/C++ 10 01.11.2009 16:01