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级。
希望你理解我的问题。 非常感谢您花时间阅读我的帖子
答案 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);
}
现在,仅仅因为代码有效并不意味着好:
c
时,您不会初始化b
。b
。尽可能使用自动变量。其中的原因是...... delete
b
new
编辑a
'中的{{1}}'构造函数。这会导致内存泄漏。如果您首先避免使用动态分配,那么这不是问题。