2011-10-06 59 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链接...我不知道...非常感谢 –