2017-01-16 117 views
0

我正在構建一個MFC應用程序,其中位於選項卡中的按鈕(因此位於單獨的類中)必須訪問某些對象中的函數來控制電機和I/O。通過引用不同的對象傳遞對象

有一個控制器類,其中創建所有其他對象。控制器對象在主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僅用於GUI中包含按鈕/字段和調用函數的選項卡。 – YouKnowNothingJohn