C++空值和此指针

C++ null value and this pointer

本文关键字:指针 空值 C++      更新时间:2023-10-16

我是C++的新手,试图学习C++。我在 Java 中有一段代码,如下所示:

public List<String> getDiagnosticTroubleCode() {
if (diagnosticTroubleCode == null) {
diagnosticTroubleCode = new ArrayList<String>();
}
return this.diagnosticTroubleCode;
}

如何将disgnosticTroubleCodenull值进行比较?并将其设置为新List。我已经覆盖了std::list,使其像 Java 中的List一样使用。然后我想返回对象this中的diagnosticTroubleCode字段。我希望你们能帮我解决这个问题。试图研究this指针和null.

这是我C++的标题:

class RUNTIME_EXPORTS DiagnosticTroubleCode {
protected:
List diagnosticTroubleCode;
public:
List getDiagnosticTroubleCode();
};

您的代码似乎只希望在首次使用时实例化diagnosticTroubleCode。坦率地说,我觉得这有点奇怪,因为一个空的std::list<std::string>实例将是相当良性的。无论如何,这是做到这一点的一种方法。


class DiagnosticTroubleCode 
{
protected:
std::unique_ptr<std::list<std::string>> diagnosticTroubleCode;
public:
std::list<std::string>& getDiagnosticTroubleCode()
{
if (!diagnosticTroubleCode)
diagnosticTroubleCode = std::make_unique<std::list<std::string>>();
return *diagnosticTroubleCode;
}
};

请注意,成员getDiagnosticTroubleCode将返回对新的(或现有(实例化列表的引用。如果您决定放弃潜在实例化(我建议这样做(,代码将变得相当简单:

class DiagnosticTroubleCode 
{
protected:
std::list<std::string> diagnosticTroubleCode;
public:
std::list<std::string>& getDiagnosticTroubleCode()
{
return diagnosticTroubleCode;
}
};

如果后者是可能的(坦率地说,我看不出它是如何不可能的(,请先追求它。在上述两种情况下,成员都是通过引用返回的,而不是值或地址。这将最类似于您可能熟悉的内容。

祝你好运。

我记得在Java中一切都是指针。所以在Java中,diagnosticTroubleCode == null本质上是将diagnosticTroubleCode与空指针进行比较。C++我们没有空,我们有NULLnullptr.在C++对象不能真正为空,因为它不是。对象在构造时会占用内存块,因此它永远不会为 null。因此,请尝试熟悉指针并将其用于您的优势。

关于this.如果要返回成员变量,其实不需要写return this.variable,只需写return variable即可返回变量。

这里的区别在于,在Java中,所有复杂的结构声明实际上是对此类结构的引用的声明。在C++,这相当于说List& fooList* foo。C/C++ 声明是 true 实例,这也是内存管理可能有点复杂的原因之一,但它带来了信息完整性的好处:例如,当您将 JavaList<String>作为方法的参数传递并更改该参数的内容时,它在调用作用域中会发生变化。另一方面,C/C++ 将复制参数而不考虑对象复杂性,当函数/方法返回时,作为参数传递的参数将被保留。

您的C++类示例应如下所示:

#include <list>
#include <string>
using namespace std;
class RUNTIME_EXPORTS DiagnosticTroubleCode {
protected:
list<string>* diagnosticTroubleCode{nullptr};
public:
list<string>* getDiagnosticTroubleCode();
};
list<string>* DiagnosticTroubleCode::getDiagnosticTroubleCode(){
if (diagnosticTroubleCode == nullptr) {
diagnosticTroubleCode = new List<string>();
}
return diagnosticTroubleCode;
}

有更好的实现不需要返回指针或引用,但它们提出了额外的设计要求(例如添加故障代码机制应该是什么(。

你可以使用这样的东西

#include <iostream>
using namespace std;
Function
class DiagnosticTroubleCode 
{
protected:
std::unique_ptr<std::list<std::string>> diagnosticTroubleCode;
public:
std::list<std::string>& getDiagnosticTroubleCode()
{
if (!diagnosticTroubleCode)
diagnosticTroubleCode = std::make_unique<std::list<std::string>>();
return *diagnosticTroubleCode;
}
};

我的.cpp文件:

shared_ptr<List> DiagnosticTroubleCodes::getDiagnosticTroubleCodes()
{
if (this->diagnosticTroubleCodes == nullptr) {
this->diagnosticTroubleCodes = make_shared<List>();
}
return diagnosticTroubleCodes;
}

和我的头文件:

class RUNTIME_EXPORTS DiagnosticTroubleCodes {
protected:
shared_ptr<List> diagnosticTroubleCodes;
public:
shared_ptr<List> getDiagnosticTroubleCodes();
};

我想出了这个解决方案。