gpt4 book ai didi

c++ - 如何创建在构造函数期间初始化的类成员对象

转载 作者:可可西里 更新时间:2023-11-01 18:32:37 24 4
gpt4 key购买 nike

我主要是一名 C# 程序员,但我正在从事的项目让我使用 C++。在 C# 中,我能够定义一个类的成员,其中该成员在初始化之前为 null。像这样:


Class Foo{
private Bar _bar;
public Foo(int valueBarNeeds){
_bar = new Bar(valueBarNeeds);
}
}

_bar 的值为空,在初始化之前禁止访问。这个用例的基本原理是私有(private)对象的构造函数依赖于一些在构造父类之前不知道的值。

现在,在 C++ 中,我尝试做同样的事情:


class Foo{
public:
Foo(int valueBarNeeds){
_bar = new Bar(valueBarNeeds);
}
private;
Bar _bar;
};

编译器抛出一个错误,指出 bar 没有采用零参数的构造函数。我的理解是,在 C++ 中,new 关键字意味着完全不同的东西。作为这种差异的一部分,可以通过不使用 new 关键字声明来定义在方法结束时处理的对象,而无需手动删除。


SomeFunc(){
int valueBarNeeds = 100;
Bar _bar(valueBarNeeds);
_bar.SomeFunc();
}

_bar 在方法堆栈超出范围时被删除。

这就提出了我的问题。如果我在 C# 中用于创建单元化对象的语法实际上试图在 C++ 中初始化对象...我如何创建一个单元化类型,该类型可访问其余类方法,由父对象构造函数构建?

最佳答案

问题是你所说的“初始化”实际上不是这样的东西。任何被初始化的成员,无论是隐式的还是显式的,都在程序进入您的构造函数体之前被初始化。

您的代码片段仅显示作业;在封装对象的构造函数主体中执行此操作并不重要。这仍然只是作业。

Bar 是一个类,因此您的成员 _bar 被隐式初始化,但实际上不可能,因为该类没有构造函数争论。为了提供参数,您必须自己显式初始化成员。

在 C++ 中,我们像这样初始化成员:

class Foo {
public:
Foo(int valueBarNeeds)
: _bar(valueBarNeeds)
{}
private:
Bar _bar;
};

你也对,你对new有点误解;与 Java 不同,它应该谨慎使用,因为对象基本上是通过简单地声明(并在必要时定义)它们来创建的。 new的使用保留在free store中动态分配,返回一个指针供使用;这种用法应该很少见。您已在最终代码片段中成功修复此问题。

How do I create an unitialized type accesible to the rest of the class methods, that gets built by the parent objects constructor?

如果成员是类类型,它将总是被初始化。你不能有一个不存在的对象。最接近的是封装一个指针而不是一个对象:

class Foo {
public:
Foo(int valueBarNeeds)
: _bar(nullptr)
{
// some time later...
_bar = new Bar(valueBarNeeds);
}
private:
Bar* _bar;
};

但是这会在内存管理和诸如此类的方面打开一堆蠕虫,如上所述,除非你真的需要它,否则你应该避免它。替代方案包括智能指针,但您仍应考虑尽可能坚持使用沼泽标准对象封装。您应该很少需要故意让对象暂时处于无效状态。

关于c++ - 如何创建在构造函数期间初始化的类成员对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19896259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com