2012-05-27 35 views
4

如何在一個類中調用另一個類的一個方法?如何調用另一個類的對象上的一個類的函數?

我有;

class A { 
public : 
    foo () ; 
}; 

class B { 
public : 
    bar () ; 
}; 

主:

A data ;   // I am creating instance of class A 

data . bar () ; // but, I am calling a method of another class 

        // how can I do that ? 

注:我無法找到一個合適的標題。如果你有一個,隨時分享或編輯

+2

你想要做什麼? – Potatoswatter

+0

有關派生類的快速參考可能會有所幫助。 http://en.cppreference.com/w/cpp/language/derived_class –

回答

0

,如果你想使用的.bar()上的一個對象A必須由B

+0

?答案:「B類:A類」 – user1414276

+0

答案是:A類:B –

+0

這是私人繼承。它可能達不到OP的要求。 – juanchopanza

1

繼承除非兩個類是相關的(通過繼承)我認爲你不能去做。

成員函數對其所屬類的實例執行一些操作。
您創建了一個類A的對象,因此您只能通過它調用A的成員函數。

研磨蘋果,希望得到一個芒果搖,不會真的發生的權利。

1

使用公有繼承:

class B { 
public: 
    void bar(); 
}; 

class A : public B 
{ }; 

int main() { 
A a; 
a.bar(); 
} 
0

目前尚不清楚你想要data.bar()做什麼。

bar()因爲沒有訪問的數據,所以bar()不能有任何與變量data。所以,我會爭辯說,data.bar()是不必要的,你只是瞄準bar()。 據推測,如果bar()只是一個功能,你可以將它聲明static,並呼籲B.data()

另一種選擇是,你想一些其他人已經寫了關於繼承。請小心繼承,並確保只有在存在is-a關係時才從B繼承A,並且它符合Liskov Principle。不要因爲必須致電bar()而繼承B。

如果你想使用B,你可以有B的例子大家都在他們的答案說裏面A.閱讀prefering composition over inheritance

0

。 這是一個壞主意,不可能。

你只能使用技巧,沒有人真正知道它會如何表現。

你可以得到一個對象的指針,並投它是B.

的poiter同樣的,唯一的用途是其他顯示什麼不該做。

A a; 
B* b = (B*)&a; 
b->bar(); 
0

我想你應該讀1個或2個C加上加書(S),並得到一個公平的想法什麼類是關於什麼目的,他們是爲了服務。

一些建議:由Bjarne Stroustrup編寫的C++程序或由Bruce Eckel編寫的C++思維或在網上搜索教程。

0

您可以使用函數指針。使其不是靜態的唯一方法是使用模板。

class A 
{ 
    public: 
    void setBar(void (*B::func)(void)) { bar = func; }; 
    void callBar() { bar(); }; 

    private: 
    void(*B::bar)(void); 
}; 

class B 
{ 
    public: 
    static void bar() { printf("you called bar!"); }; 
}; 

int main() { 
    A a; 
    a.setBar(B::bar); 
    a.callBar(); 
} 
0

還可以聲明B類爲A類的friend

我相信它的語法是:

class A { 
    public: 
     foo(); 
    friend class B; 
}; 
class B { 
    public: 
     bar(); 
}; 

但是這一點,我相信你只能使用函數/從AB函數的變量。繼承可能是您更好的方法。

-1

雖然這個問題很奇怪!,但這裏有一些解決方案 使用繼承

class A: public B 

類型轉換

A data; 
((B*)&data)->bar(); 

或重新解釋投

B* b = reinterpret_cast <B*> (&data); 
b->bar(); 

如果bar()的使用B的任何成員變量,那麼結果是不可預測的。

+0

投射版本都會導致未定義的行爲 –

+0

這兩個投射版本實際上是等效的。如果bar()沒有使用任何非靜態成員變量形式B,它可以被指定爲一個靜態成員函數,沒有任何錯誤或影響。 –

+0

如果bar()沒有使用任何非靜態成員變量形式B,它就像一個靜態函數。它可以被指定爲靜態成員函數,沒有任何錯誤或副作用。然後,可以使用任何有效的B *類型的指針來無誤地調用bar()。嘗試一下!。 –

相關問題