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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2013, 04:30   #1
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию Инициализация ссылки на vector не через аргумент конструктора.

Здравствуйте!
У меня вопрос. Можно ли как-то инициализировать в конструкторе класса ссылку на vector, но не через аргумент конструктора.
Код:
class Iclass {
	int a;
	vector <int > &values;
public:
	Iclass(const int a, vector <int > &values) : a(a), values(values) {}
	void change_values() const {
		values.push_back(a);
                values.push_back(a);
	}
	~Iclass() {}
};
Так сделать можно. Но как сделать так, что бы второго аргумента у конструктора не было, а вектор изначально был бы, скажем, пустым или с одним любым значением, которое можно потом удалить.
Извините за странный вопрос и заранее спасибо за помощь.

Последний раз редактировалось Stilet; 10.02.2013 в 16:44.
Leiph вне форума Ответить с цитированием
Старый 09.02.2013, 05:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас ссылка, значит класс не имеет своего вектора, а применяет переданный в конструктор.

а вот если заменить на указатель, то можно организовать подобное, только нельзя последний терять(хотя можно и ссылку применить как указатель, ток не стоит) и не забыть удалить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.02.2013, 14:51   #3
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

А как же сделать через указатель? Ведь он собственно должен как то ссылаться на объект типа vector, а объекта не передается (как по сути и с ссылкой).
Leiph вне форума Ответить с цитированием
Старый 09.02.2013, 16:58   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Поменять vector <int > &values на vector <int > *values.
Только я не понял, вы ходите, чтоб в конструкторе не было вектора но хотите добавлять данные в вектор?
waleri вне форума Ответить с цитированием
Старый 10.02.2013, 12:15   #5
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Да, хочу не передавать ссылку на вектор через аргумент конструктора, но создавать объект вектора в инициализации конструктора.
Leiph вне форума Ответить с цитированием
Старый 10.02.2013, 12:48   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну так и создавайте вектор, в чем проблема?
Сделайте, чтоб values было обычным вектором а не ссылкой.
waleri вне форума Ответить с цитированием
Старый 10.02.2013, 13:42   #7
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Да ну не задавал бы я такой вопрос, если бы не нужно было бы сделать вектор именно ссылкой или указателем. Именно ссылка или указатель на вектор должны быть потому, что функция класса имеет идентификатор const. Я не могу в ней менять значения полей класса. Понимаю, проблема дурацкая, но я подумал, может кто знает решение.
Leiph вне форума Ответить с цитированием
Старый 10.02.2013, 14:22   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сделайте две переменные - вектор и ссылку на вектор, вот и все, только не уверен, что ссылка поможет.
Если у вас в const функции надо менять член класса, значит вам скорее надо функцию переделать, чтоб не была const.
waleri вне форума Ответить с цитированием
Старый 10.02.2013, 15:26   #9
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Спасибо. Не додумался до такого хода. Все работает.
Код:
class Iclass {
int a;
	int b;
	vector < int > values;
	vector <int > &values_ref;
public:
	Iclass(const int a, const int b) :a(a),b(b),values(0),values_ref(values)  {  
}
	void change_values() const {
		values_ref.push_back(a);
		values_ref.push_back(b);
	}
	void print_values() const {
		for(size_t i=0;i<values_ref.size();i++)
			printf("\nvalues[ %i ] = %i\n",i,values_ref[i]);
	}
	~Iclass() {}
};
From Stilet: И правила соблюсти тоже не додумался?

Последний раз редактировалось Stilet; 10.02.2013 в 16:46.
Leiph вне форума Ответить с цитированием
Старый 10.02.2013, 16:28   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

я бы убрал const...
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение результата через аргумент NinjaNoob Помощь студентам 8 04.12.2012 11:04
static const vector инициализация red6ds Общие вопросы C/C++ 2 06.10.2012 13:03
std::vector и его инициализация coNsept Общие вопросы C/C++ 5 15.06.2012 13:40
STL: vector, инициализация Сtrl Общие вопросы C/C++ 3 07.05.2011 19:41
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора jennya Visual C++ 8 03.10.2010 19:03