2015-04-06 55 views
0

我需要構建一組相互依賴的類。當我將一個類的指針傳遞給另一個在其中實例化的類時,我遇到了麻煩。如何取消引用另一個對象內的對象的指針

這裏舉一個例子來說明我的問題。

#include<iostream> 
#include<vector> 

using namespace std; 

class base; 

// 

child class 
    class child 
    { 
    public: 
    child(){}; 
    void setPointer (base* ptr){pointer = ptr; } 
    void printing(){(*pointer).print();} // error C2027: use of undefubed type base 
             // error C2227: '.print' must have class/struct/union 
private: 
    base* pointer; 
}; 

// base class 
class base 
{ 
public: 
    base() 
    { 
     initial_vec(); 
     VEC[0].setPointer(this); 
     VEC[0].printing(); 
    } 

    void print() { cout <<"printing from BASE"<< endl;} 

    void initial_vec() 
    { 
     child child1; 
     VEC.push_back(child1); 
    } 

private: 
    vector<child> VEC; 
}; 

int main() 
{ 
    base b1; 

    system("pause"); 
    return 1; 
} 

你知不知道我是如何實現這些功能的?

預先感謝您

+0

您不能從內聯代碼中取消引用前向聲明。這必須展示給一個單獨的翻譯單位。 –

回答

0

它看起來像你得到它,因爲你正在嘗試只用向前聲明呼籲printing()base類的錯誤。要解決您的問題,請在base類完全定義後定義函數printing()的正文。

Here是關於前向聲明的更多細節。

0

「你知不知道我怎麼做到的,不會發生那些錯誤?」

這很簡單。你省略引用base的內聯codeparts和類的完整聲明後,移動TEM:

#include<iostream> 
#include<vector> 

using namespace std; 

class base; 

child class { 
    public: 
    child(){}; 
    void setPointer (base* ptr); // <<< Only declare the functions here 
    void printing(); 

private: 
    base* pointer; 
}; 

// base class 
class base { 
public: 
    base() 
    { 
     initial_vec(); 
     VEC[0].setPointer(this); 
     VEC[0].printing(); 
    } 

    void print() { cout <<"printing from BASE"<< endl;} 

    void initial_vec() 
    { 
     child child1; 
     VEC.push_back(child1); 
    } 

private: 
    vector<child> VEC; 
}; 

定義功能後,基地被充分地宣稱:

void child::setPointer (base* ptr){pointer = ptr; } 
void child::printing(){(*pointer).print();} 

int main() { 
    base b1; 

    system("pause"); 
    return 1; 
} 
相關問題