Сложность в передачи функций других классов по адресу
У меня есть класс CStep4, в этом классе создал конструктор, в котором находятся адреса функций других классов. Также есть функция к классу CStep4, где есть переменные, которые должны заимствоваться из других функций других классов.
Проблема заключается в переменных t1, компилятор их не видит. Сама t1 используется в качестве формулы.
class CStep4: public CPeleng{
public:
CStep4(CCoord& P1, CStep2& t1, CPeleng& a_peleng_1);
CStep4 Pt1(){
double Xt1 = x1 + t1 * cos_ax;
double Yt1 = y1 + t1 * cos_ay;
double Ht1 = h1 + t1 * cos_ah;
}
class CStep2: public CCoord{
protected:
static double a1;
static double a2;
static double a3;
static double b1;
static double b2;
static double b3;
CStep2(CCoord& P1, CCoord& P2, CPeleng& a_peleng_1, CPeleng& a_peleng2);
void T1(){
a1 = cos(ah)*cos(bx)-cos(ax)*cos(bh);
a2 = cos(ay)*cos(bh)-cos(ah)*cos(by);
a3 = cos(ax)*cos(by)-cos(ay)*cos(bx);
b1 = cos(ax)*(h2-h1)-cos(ah)*(x2-x1);
b2 = cos(ah)*(y2-y1)-cos(ay)*(h2-h1);
b3 = cos(ay)*(x2-x1)-cos(ax)*(y2-y1);
}
public:
CStep2 f_t1(){
CStep2 t1 = -((a1*b1 + a2*b2 + a3*b3)/(pow(a1,2) + pow(a2,2) + pow(a3,3)));
return t1;
}
};
Ответы (1 шт):
Основываясь на ваших предыдущих вопросах у меня сложилось впечатление (которое может быть ошибочно т.к. я не вижу всего кода), что вы объявляете конструктор, но не определяете его, и считаете, что все помещённые в него объекты видны вашему классу. Это не так. Всё что вы в него помещаете необходимо где-то да сохранить. Например (это лишь промежуточный пример, не принимайте его за конечный):
class CStep4: public CPeleng{
private:
CCoord* p_P1; // Поля которые хранят указатели
CStep2* p_t1; // на объекты
CPeleng* p_a_peleng_1; // переданные в конструктор
public:
CStep4(CCoord& P1, CStep2& t1, CPeleng& a_peleng_1) {
//Тело конструктра
p_P1 = &P1; //Сохраняем указатели на элементы
p_t1 = &t1; // в поля которые объявили выше
p_a_peleng_1 = &a_peleng_1;
}
CStep4 Pt1() {
double Xt1 = p_P1->x1 + p_t1->f_t1() * p_a_peleng_1->cos_ax; //Используем поля из сохраннёных классов
double Yt1 = p_P1->y1 + p_t1->f_t1() * p_a_peleng_1->cos_ay;
double Ht1 = p_P1->h1 + p_t1->f_t1() * p_a_peleng_1->cos_ah;
return /*по вашему объявлению этот метод должен возвращать CStep4 поэтому */ *this;
}
};
Предположу, что на самом деле Pt1 выполняет функцию конструктора, а поэтому гораздо более правильно будет сделать так:
class CStep4 { //Я убрал наследование т.к. не вижу каким образом вы
//используете поля/методы родительского класса
private:
double Xt1; // Поля которые хранят данные
double Yt1; // Они не static т.к. уникальны
double Yt1; // для каждого экземпляра класса
public:
CStep4(CCoord& P1, CStep2& t1, CPeleng& a_peleng_1) {
//Тело конструктра
// Поля x1, cos_ax и т.п. должны быть публичными
// Иначе используйте гетеры/сетеры
Xt1 = P1.x1 + t1.f_t1() * a_peleng_1.cos_ax; //Инициализируем поля класса
Yt1 = P1.y1 + t1.f_t1() * a_peleng_1.cos_ay; //На основе классов переданных в конструктор
Ht1 = P1.h1 + t1.f_t1() * a_peleng_1.cos_ah;
//Объект класса CStep4 создан
}
};
Как я уже отмечал выше поля класса static являются общими для всех объектов класса. Если CStep2 написан верно, то метод f_t1 должен выглядеть так:
static double f_t1(){ //Метод static т.к. работает только со static полями
//Метод возвращает double т.к. считает double число
double t1 = -((a1*b1 + a2*b2 + a3*b3)/(pow(a1,2) + pow(a2,2) + pow(a3,3)));
return t1;
}
В таком случае его можно будет вызывать без экземпляра класса:
CStep2::f_t1(); // Вызов метода
Но вновь подозреваю, что по идее поля a1, a2 и т.д. должны быть уникальными для каждого класса CStep2, а содержимое метода T1 должно быть перенесено в конструктор, как в примере №2. Метод f_t1 в таком случае должен быть не статическим.
Опять же, предположу, что вы используете наследование исключительно для доступа к protected полям. Оно нужно не для этого (учитывая что вы передаёте элементы с нужными вам полями в конструктор), и, возможно, вам стоит убрать его и использовать обычные гетеры/сетеры. Для доступа к приватным полям можно объявить класс, которому желаете предоставить доступ, как friend.