2017-01-16 8 views
0

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

Существует один класс контроллера, в котором созданы все остальные объекты. Объект контроллера создается в основном коде 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"); 
} 
+0

Обратите внимание, что поскольку у вас есть ссылочные элементы, 'A' больше не может быть скопирован или перемещен. – NathanOliver

+0

@NathanOliver 'A' по-прежнему можно копировать, его нельзя назначить. –

+0

@ FrançoisAndrieux Упс. Забыл назначаемую часть. Благодарю. – NathanOliver

ответ

0

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

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(); 
} 
+0

Должен признать, что я не уверен, что произойдет, если ClassA не движется. ClassA в этом случае просто будет использоваться для вкладок в графическом интерфейсе, который содержит кнопки/поля и функции вызовов. – YouKnowNothingJohn