Передать объект по ссылке на другой объект

Я создаю приложение MFC, где кнопки, расположенные на вкладке-и, следовательно, в отдельном классе — должны получить доступ к функциям в определенных объектах для управления двигателями и вводом-выводом.

Существует один класс контроллера, в котором создаются все остальные объекты. Объект controller создается в основном коде MFC. Все функции можно таким образом вызвать через регулятор путем использование controller.object.function.

Кнопки, упомянутые выше, расположены в другом классе и не могут получить доступ к этим функциям по умолчанию, поэтому мне нужно предоставить им доступ. Я написал этот тестовый проект и хотел бы получить обратную связь о том, как я передаю объект по ссылке.

Считается ли это правильным способом передачи объекта по ссылке?

#include <iostream>

class ClassA;
class ClassB;


class ClassB {
public:
    ClassB();
    void addOne();
    int b;
};

ClassB::ClassB() :
    b(0) {
}

void ClassB::addOne() {
    b = b + 1;
}


class ClassA {
public:
    ClassA(ClassB & B_ref);
    void addOneToB(); 
private:
    ClassB & B;
};

ClassA::ClassA(ClassB & B_ref) :
    B(B_ref) {
}

void ClassA::addOneToB() {
    B.addOne();
}


int main() {
    ClassB B;
    B.addOne();
    std::cout << B.b << "n";

    ClassA A(B);
    A.addOneToB();
    std::cout << B.b << "n";

    system("pause");
}

1 ответ

  1. Решение является прекрасным, за исключением того, что класс со ссылочным элементом не является подвижным и не может быть назначен.

    int main() {
        ClassB foo;
        ClassB bar;
    
        ClassA foo_wrapper(foo);
        ClassA bar_wrapper(bar);
    
        // Can't assign, won't compile!
        foo_wrapper = bar_wrapper;
    
        system("pause");
    }
    

    Если ваша конструкция выиграла бы от ClassAтого, чтобы быть подвижной или назначаемой, вы используете ClassB * B;вместо этого.

    class ClassA {
    public:
        ClassA(ClassB & B_ref);
        void addOneToB();
    
    private:
        ClassB * B;
    };
    
    ClassA::ClassA(ClassB & B_ref) :
        B(&B_ref) {
    }
    
    void ClassA::addOneToB() {
        B->addOne();
    }