如何将基类子对象的成员初始化为0?

发布于 2024-10-20 20:10:22 字数 433 浏览 1 评论 0原文

class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

子对象数据成员a、b、c如何初始化为0?我无权修改 A 类。

class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

How could the subobject data members a,b and c be initialized to 0? I am not permitted to modify class A.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

窝囊感情。 2024-10-27 20:10:22

Try

B() : A() , d(0){}

A() 值初始化 A,并且由于 A 是 POD,因此成员将被默认(零)初始化


Try

B() : A() , d(0){}

A() value initializes A and since A is a POD the members will be default(zero) initialized


貪欢 2024-10-27 20:10:22

我测试了这个,因为我认为它可能有效(即使没有 Prasoon 的答案)

B::B() : A(), d(0)
{
}

可能有效,因为你然后“初始化”A。

顺便说一句,它没有。输出:
1,32,123595988

但这可以工作:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

其次是:

B::B() : A( a_init), d(0)
{
}

我正在使用 g++ 4.3.2 进行测试。现在起作用了:

B::B() : A(A()), d(0)
{
}

I tested this as I thought it might work (even without Prasoon's answer)

B::B() : A(), d(0)
{
}

might work, because you are then "initialising" A.

It didn't, by the way. Output:
1,32,123595988

This would work though:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

followed by:

B::B() : A( a_init), d(0)
{
}

I am testing using g++ 4.3.2. Now THIS worked:

B::B() : A(A()), d(0)
{
}
高跟鞋的旋律 2024-10-27 20:10:22

也许我错过了一些东西,但是这个怎么样?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}

Perhaps I'm missing something, but how about this?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}
属性 2024-10-27 20:10:22

正确的方法当然是让 A 的构造函数初始化它的成员。否则,由于成员不是私有的,您可以从 B 构造函数内部为它们分配值。

a = 0;

等等,确实有效。

The proper way is of course to have A's constructor initialize it's members. Otherwise, as the members are not private, you can assign them values from inside the B constructor.

a = 0;

etc, actually works.

若相惜即相离 2024-10-27 20:10:22

声明派生类构造函数,如下所示

class B: public A
{
   public: int d;
   B():a(0),b(0),c(0),d(0)
   {

   }

};

declare the derived class constructor as shown below

class B: public A
{
   public: int d;
   B():a(0),b(0),c(0),d(0)
   {

   }

};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文