Использование контейнера указателей для присваивания значений членам класса
Проблема в том что у меня много различных членов-переменных в классе , для того что бы не писать функцию со множеством параметров я решил инициализировать указатели следующим образом. Я создаю контейнер помещаю туда те члены класса которые мне нужно инициализировать и передаю по ссылке в функцию, там соответственно перебираю контейнер и присваиваю каждому элементу значение , проблема в том что присваивания не происходит. Помогите пожалуйста.
#include <iostream>
#include <vector>
class Sample {
public :
Sample() {
std::vector<int*> cont = { a, b };
iniVector(cont);
}
int* Get_A() { return a; }
int* Get_B() { return b; }
private:
void iniVector(std::vector<int*>& vec_p_int) {
int _a = 10;
int _b = 20;
int* _a_p = &_a;
int* _b_p = &_b;
vec_p_int[0] = _a_p;
vec_p_int[1] = _b_p;
}
int* a = NULL;
int* b = NULL;
};
int main()
{
Sample* smaple = new Sample();
printf("%d", *smaple->Get_A());
printf("%d", *smaple->Get_B());
}
Ответы (2 шт):
- Ваш вектор в конструкторе является локальным объектом, он уничтожается сразу после конструирования объекта. И зачем для двух объектов(указателей) нужен вектор, непонятно...
- Нет у вас в классе много различных членов-переменных, а есть два указателя, присутствие которых обязывает вас писать как минимум конструктор копирования, оператор присваивания и деструктор.
- Вы пытаетесь инициализировать члены_указатели в функции, адресами локальных объектов этих функций, которые тоже уничтожаются сразу после вызова функции, и на что будут указывать ваши указатели?...
Куда лучше держать в классе просто объекты и работать с ними. То что вы хотите сделать это:
class Sample {
public:
Sample(int _a = 10, int _b = 20)
: a(_a), b(_b) { }
int Get_A() const { return a; }
int Get_B() const { return b; }
private:
int a;
int b;
};
int main()
{
Sample* smaple = new Sample;
printf("%d", smaple->Get_A());
printf("%d", smaple->Get_B());
delete smaple;
}
И не нужна вся ваша возня непонятная... Если не устраивает, расскажите подробно чего вы хотите добиваться.
Это мое решение, я по глупости забыл что созданная в функции переменная удалякется после выхода из функции. typedef int* point; typedef double* Direction;
enum someType{Tangent, Normal};
class Sample_3 {
public :
Sample_3(){
// допустим мы хотим инициализировать точку и провести из нее два направления друг другу перпендикулярные
std::vector<someType> typesForDir = { Normal, Tangent };
// Необходимо инициализировать одну точку и два направления через функцию inizilize
std::vector<Direction> iniDirections{ this->dir_p_1_x, this->dir_p_1_y };
inizilize(5.0, this->p_1, typesForDir, iniDirections);
// инициализируем теперь точку 2 а из нее нам нужно направление тангенциальное
std::vector<someType> typFor_dir_p2_y{ Tangent };
std::vector<Direction> dirr{ this->dir_p_2_y };
inizilize(10.0, this->p_2, typFor_dir_p2_y, dirr);
//Ну и так далее
//Суть в том что бы не дубиловать код в отдельных функциях инициализации для point и dirrection , есть смысл их инициализировать вместе
// Но мы точно знаем что точка может быть одна а вот направлений из этой точки может быть множество, так вот
//как инициализировать переменные класса заранее положив их в контейнер.
// Мое решение это следеющее
// Так как вектор изменяется в функции то мы просто присвоим членам классам значения из вектора
dir_p_1_x = iniDirections[0];
dir_p_1_y = iniDirections[1];
}
point Get_p_1() {
return this->p_1;
}
Direction Get_member_1_t2() {
return this->dir_p_1_x;
}
private :
point p_1 = NULL;
point p_2 = NULL;
point p_3 = NULL;
Direction dir_p_1_x = NULL;
Direction dir_p_1_y = NULL;
Direction dir_p_2_y = NULL;
Direction dir_p_3_x = NULL;
private:
//В связи стем что инициализация точки и направления отличается одной строчкой кода, то
//нет необходимости дублировать код а все поместить в одну функцию
void inizilize(double offset/*I*/
, point& p_1 /*O*/, std::vector<someType> typesForDirr /*Input*/,
std::vector<Direction>& cretedDir /*Output*/ ) {
//Инициализация точки и контейнера с направлением
}
};