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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2016, 20:53   #1
NEymexa:c
Пользователь
 
Регистрация: 26.02.2015
Сообщений: 24
Восклицание Структура в классе C++

Здравствуйте! Только начал разбираться в структурах и классах, прошу подсказать.
Есть задача: "..Карточка иностранного слова представляет собой структуру, содержащую иностранное слово и его перевод. Для моделирования электронного словаря иностранных слов реализовать класс Dictionary. Данный класс имеет поле-название словаря и содержит массив структур WordCard, представляющих собой карточки иностранного слова... "

Вопрос: правильно ли реализовал класс и как работать с полями структуры?

Код:
class Dictionary
{
private:
	struct WordCard
	{
		char *word;
		char *translation;
	};

	std::string name;
public:
	Dictionary();
	struct WordCard Card[200];
};
NEymexa:c вне форума Ответить с цитированием
Старый 24.03.2016, 21:26   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Если вы хотите извне обращаться, то переместите описание структуры в public или вообще просто перед классом поместите.

"Извне" значит так:
Код:
Dictionary dict;
dict.Card.word = "";
И в С++ (а не С) не надо писать struct WordCard Card, просто WordCard Card.

Но скорее всего вам надо сделать массив private и сделать public функции для работы с ним.

Код:
class Dictionary
{
private:
	struct WordCard
	{
		std::string word;
		std::string translation;
	};

	std::string name;

	WordCard cards[200];

	............ что-то еще, например количество добавленных карточек (изначально 0)
public:
	Dictionary(std::string name);

	std::string getName();

	void addCard(std::string word, std::string translation);
	std::string getTranslation(std::string word);
};
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 24.03.2016 в 21:28.
Alex11223 вне форума Ответить с цитированием
Старый 28.03.2016, 21:46   #3
NEymexa:c
Пользователь
 
Регистрация: 26.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Но скорее всего вам надо сделать массив private и сделать public функции для работы с ним.

Код:
class Dictionary
{
private:
	struct WordCard
	{
		std::string word;
		std::string translation;
	};

	std::string name;

	WordCard cards[200];

	............ что-то еще, например количество добавленных карточек (изначально 0)
public:
	Dictionary(std::string name);

	std::string getName();

	void addCard(std::string word, std::string translation);
	std::string getTranslation(std::string word);
};
Такой вопрос возник. Как удалить элемент из массива структур?

Последний раз редактировалось NEymexa:c; 28.03.2016 в 21:49.
NEymexa:c вне форума Ответить с цитированием
Старый 28.03.2016, 22:02   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Если просто фиксированный массив как тут, то никак, у вас всегда будет массив с 200 экземплярами структуры.

Например сделайте переменную (count) для хранения кол-ва "добавленных"/используемых элементов (0-200). При добавлении записывайте данные в элемент с номером count и увеличивайте ее. При удалении сдвигайте элементы влево начиная с удаляемого и уменьшайте count.

А так есть std::vector если не обязательно такой массив.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.03.2016, 21:28   #5
NEymexa:c
Пользователь
 
Регистрация: 26.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Если просто фиксированный массив как тут, то никак, у вас всегда будет массив с 200 экземплярами структуры.

Например сделайте переменную (count) для хранения кол-ва "добавленных"/используемых элементов (0-200). При добавлении записывайте данные в элемент с номером count и увеличивайте ее. При удалении сдвигайте элементы влево начиная с удаляемого и уменьшайте count.

А так есть std::vector если не обязательно такой массив.
Снова вопрос. В задание нужно реализовать возможность создать новые словари и выполнить с ними операции (объединения, пересечения и вычитания).
То есть создать динамический массив объектов класса ?
Код:
Dictionary* Dict = new Dictionary();
Так правильно, если да, то как потом с ним работать? Подскажите пожалуйста

Последний раз редактировалось NEymexa:c; 30.03.2016 в 21:37.
NEymexa:c вне форума Ответить с цитированием
Старый 30.03.2016, 21:48   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зависит от того как это делать.

В этой строчке создается один словарь, а не массив.

Вообще лучше избегать использования new (выделение памяти в куче/heap) без необходимости, ибо эту память надо освобождать с помощью delete (или smart pointer и т.п.), а вместо этого создавать объекты просто в стеке.

Например так:

Код:
    std::vector<Dictionary> dictionaries;

    while (1)
    {
        ...............
        if добавление
           dictionaries.push_back(Dictionary());
    }
Ну или аналогично как с массивом карточек.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.03.2016, 22:28   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от NEymexa:c Посмотреть сообщение
Снова вопрос. В задание нужно реализовать возможность создать новые словари и выполнить с ними операции (объединения, пересечения и вычитания).
То есть создать динамический массив объектов класса ?
Код:
Dictionary* Dict = new Dictionary();
Так правильно, если да, то как потом с ним работать? Подскажите пожалуйста
STL, это конечно интересно. Но для учёбы, лучше использовать связный список. Просто в структуру, нужно добавить указатель. Например так:

Код:
struct WordCard
	{
		std::string word;
		std::string translation;
                WordCard *start_ptr;
	};
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.03.2016, 22:59   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

От задачи зависит что лучше. Зачем связный список если например нужно обращаться по индексу? (типа взять второй и пятнадцатый словарь)

И автор сейчас вообще не про WordCard спрашивал. Про который в задании просили "массив структур".
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 31.03.2016, 01:57   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
От задачи зависит что лучше. Зачем связный список если например нужно обращаться по индексу? (типа взять второй и пятнадцатый словарь)

И автор сейчас вообще не про WordCard спрашивал. Про который в задании просили "массив структур".
Собственно STL реализует вектор, стек, очередь и ещё много чего. Но для новичка, она тяжела для изучения. Всякие итераторы, попы, пуши, инкременты, декременты и т.д.
Для понимания сути вещей, ему нужно сначала научится работать со связными списками.
Если нужно несколько справочников, создаём две структуры. Одна, содержит всего два указателя и имя справочника. Один на саму себя. Другой, на справочник (Library, Dictionary и Name).
Тогда, для создания группы справочников, сначала добавляем к Library один элемент и присваиваем ему имя. Затем создаём элемент списка слов, ссылку на него и записываем в Dictionary. К тому, же такую структуру, легко сохранять в XML файле т.к. она имеет иерархическую структуру.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 31.03.2016 в 02:03.
Smitt&Wesson вне форума Ответить с цитированием
Старый 31.03.2016, 10:02   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык с чего вы взяли, что тут именно связный список нужен, а не массив?
Можно ж и свой массив с изменяемым размером (ну как std::vector: size, capacity и т.п.) навелосипедить, тоже не менее полезно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс в классе RAFA91 Общие вопросы C/C++ 4 25.05.2015 12:24
Структура DateTime, битовая структура prepare2die Помощь студентам 1 10.03.2015 13:32
Структура в классе ArmanPrestige Общие вопросы C/C++ 4 24.06.2012 20:24
Класс в классе Alex11223 Общие вопросы C/C++ 2 13.04.2011 23:10
Ошибка в классе Superlotles Общие вопросы C/C++ 2 09.07.2010 00:05