2011-10-06 61 views
1
class a 
{ 
    private: 
    b *b_obj; 
    public: 
    void set(int); 
}; 

a::a() 
{ 
    b_obj = new b; 
} 

a::set(int s) 
{ 
    b_obj->c = s; 
} 

class b 
{ 
    public: 
    int c; 
}; 

此代碼無效? 如果不是,我如何使b_obj的類a的特定對象(說a_obj),可以在另一個類c中修改...如果a_obj我在另一個類d創建....我害怕a_obj超出範圍在c類中。類別範圍

希望你能理解我的問題。 非常感謝您抽出時間來閱讀我的文章

+1

也許一次一個單一的具體問題,連同一個連貫的小代碼示例,將鼓勵更好的答案... –

+0

投票結束爲「不是一個真正的問題」。 @CAD_Coding,明確你的想法,直到你有了詳細和具體的個別問題,然後提出這些問題,或者只是問你的「最終」問題。希望這可以幫助。 –

+0

@BinaryWorrier能不能回答我的「終於」問題呢? –

回答

0

該代碼是將近有效。 class bclass a之前需要聲明(或者至少是預先聲明的),您沒有在a::set的定義中指定返回類型,並且您沒有提供a默認構造函數的聲明。下面是修改後的代碼,用測試工具一起:

class b 
{ 
    public: 
    int c; 
}; 

class a 
{ 
    private: 
    b *b_obj; 
    public: 
    a(); 
    void set(int); 
}; 

a::a() 
{ 
    b_obj = new b; 
} 

void a::set(int s) 
{ 
    b_obj->c = s; 
} 

int main() 
{ 
    a my_a; 
    my_a.set(42); 
} 

現在,只是因爲代碼有效並不意味着它是

  1. 你不初始化c當默認構造b
  2. 您可以使用原始指針指定流行分配的b's。儘可能使用自動變量。這其中的原因是...
  3. 你從來沒有deletebnew'編在a'的構造函數。這導致內存泄漏。如果您首先避免使用動態分配,這不會成爲問題。
+0

非常感謝!!!! :) 測試正是我想說的話+ 1件事我要問:在主 ()如果我使用: 的printf( 「\ n%d \ n」,b_obj-> get()方法) ; // get()返回c 我在類b的析構函數中使用delete b_obj ... 那麼上面的printf打印42還是會超出範圍? –

+0

很難說沒有看到實際的代碼,但如果我明白你問的是什麼,那麼是的。你爲什麼不嘗試一下,找出答案? –

+0

非常感謝... –

0

好,

*b_obj = *other_b_obj;// equality of objects values 
b_obj = other_b_obj; // equality for pointer values 

假設b_obj是一個對象,other_b_obj是一個指針:

b_obj = *other_b_obj; 

假設相反:

b_obj = &other_b_obj; 

假設兩者都是指針:

b_obj = other_b_obj; 

你的最後一個問題,new是不是強制性的assgining指針。指針可能指向一個正在退出的對象。但是,如果您希望指針指向新對象,請使用new關鍵字,該關鍵字會嘗試創建新對象並返回新對象地址。

+0

-1:不正確。 'b_obj'是指向''b'的指針 –

+0

仍然不正確。據我們所知,對於'* b_obj = * other_b_obk'沒有什麼是無效的,除非它是普通的錯誤編碼。 –

+0

@JohnDibling什麼是不正確的,我的朋友? – 2011-10-06 14:30:59

0

此代碼無效?

的代碼是幾乎有效的,但你忘了陳述集函數的返回類型:

void a::set(int s) 

然而,設定的功能將真正改變的b_objc成員。它是公開的,所以編譯器會允許它。

BTW, why don't you try for yourself?

順便說一句,而你正在學習,看看構造函數,析構函數,賦值運算符和實施他們釋放對象b_obj正常。你甚至可以使用shared_ptr

此外,我不建議你使用小寫字母a這樣一個乏味的名字作爲一個類。

+0

感謝您的ideone鏈接...我不知道...非常感謝 –