Сложность в передачи функций других классов по адресу

У меня есть класс 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 шт):

Автор решения: needKVAS

Основываясь на ваших предыдущих вопросах у меня сложилось впечатление (которое может быть ошибочно т.к. я не вижу всего кода), что вы объявляете конструктор, но не определяете его, и считаете, что все помещённые в него объекты видны вашему классу. Это не так. Всё что вы в него помещаете необходимо где-то да сохранить. Например (это лишь промежуточный пример, не принимайте его за конечный):

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.

→ Ссылка