也许有人一个简单的问题在那里,但我究竟在下面的例子中做错了什么? 我试图建立包含内......我想我要去哪里错归结为下面的示例中的其他类的实例化一个全球性的类。 获得一个赛格故障,仿佛永远不会创建* B。 提前致谢!!
#include <iostream>
using namespace std;
class A;
class B;
class B
{
public:
B()
{
b = 99;
}
~B();
int Getb() {return b; }
void Setb (int x) { b = x; }
private:
int b;
};
class A
{
public:
A()
{
B *b = new B;
}
~A();
B * b;
void Printout()
{
cout<<b->Getb()<<endl;
}
private:
};
int main()
{
A *a = new A;
a->Printout();
cin.get();
}
A() {
B *b = new B;
}
B * b;
在构造函数中你宣称被分配的新分配的地址, 一个新的局部变量 B
,然后忘了!
实例字段b
从未分配到,因为它是在构造函数中同名的局部变量阴影。
你可能说到做到
A() {
b = new B;
}
A()
{
B *b = new B;
}
应该
A()
{
b = new B;
}
在您的版本有一个叫做变量b的构造函数。 这个变量会隐藏类成员也被称为B(这是很明显,你想用一个)。
在cosntructor A::A()
你不用来初始化了A::b
成员,但局部变量来代替。 尝试这样做:
A() {
b = new B;
}
或更好:
A():b(new B) {}
更妙的是,不要使用原始指针都没有。
B *b = new B;
创建一个名为局部变量b
,其阴影类的成员b
。 您需要初始化类的成员,你应该这样做在初始化列表。
A() : b(new B) {}
下一步是解决造成永不调用内存泄漏delete
你动态分配的指针,但由于这是一个学习锻炼它可能不是非常重要的()。
虽然不少人都指出解决您所看到的问题的一种方式,似乎没有(对我来说,反正)是如何真正使代码更好的提供意见。
你的定义B
是什么叫做quasi-class
。 为了使长话短说,你的B
可以简化很多没有失去任何东西:
struct B {
int b;
B() : b(99) {}
};
一切你所做的(获得/套,析构函数)是实现绝对没有。 您的A
类,不仅实现只是尽可能小,但确实它甚至更差。 其他人已经指出了这个问题A
类的构造函数定义一个局部B
对象,然后泄露该对象。 无(我见过的,反正)曾指出,即使你解决这个问题,你定义A
将泄漏B
反正对象,因为即使它会创建一个B
对象创建的一部分A
对象,它不破坏B
当对象A
包含它的对象被销毁。
我看不出有任何理由为你A
类动态分配B
所有对象(或者,当你到它,甚至存在)。 我定义了A
更像是这样的:
class A {
B b;
public:
void print() { std::cout << b.b << "\n";
};
这将是更好的,但是,如果B
对象知道如何将自身插入到数据流-如果它使用的是正常的语法,以及:
std::ostream &operator<<(std::ostream &os, B const &b) {
return os << b.b;
}
有了这个地方,你的A
类增加什么都没有,所以你的整个程序变得这样的事情:
struct B {
int b;
B() : b(99) {}
};
std::ostream &operator<<(std::ostream &os, B const &b) {
return os << b.b;
}
int main() {
std::cout << B() << "\n";
return 0;
}
伟大的秘诀球员,即使现在回想起来我混淆了我的问题与命名int变量B(不该得到什么,但b!)。 这就是说,你们“指出”我的方向初始化列表,析构函数,最终组成的话题。 非常感谢如何实现阶级成分在C ++?