课程范围

时间:2011-10-06 14:16:12

标签: c++

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;
};

此代码有效吗? 如果不是,我如何制作a类特定对象(比如a_obj)的b_obj,可以在另一个类c中修改...如果a_obj我在另一个类d中创建....我害怕a_obj超出范围c级。

希望你理解我的问题。 非常感谢您花时间阅读我的帖子

3 个答案:

答案 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并不是强制指点。指针可以指向退出对象。但是,如果希望指针指向新对象,请使用new关键字,该关键字尝试创建新对象并返回新对象地址。

答案 1 :(得分:0)

  

此代码有效吗?

代码几乎有效,除了你忘了陈述set函数的返回类型:

void a::set(int s)

但是,set函数将真正更改c的{​​{1}}成员。它是公共的,因此编译器将允许它。

BTW, why don't you try for yourself?

顺便说一句,在学习的过程中,请查看构造函数,析构函数,赋值运算符,并实现它们以正确释放对象b_obj。您甚至可以使用b_obj

另外,我不建议你使用这样一个枯名的小名shared_ptr作为一个类。

答案 2 :(得分:0)

代码几乎有效。在class b中引用class 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。尽可能使用自动变量。其中的原因是......
  3. 您永远不会delete b new编辑a'中的{{1}}'构造函数。这会导致内存泄漏。如果您首先避免使用动态分配,那么这不是问题。