C++ 空值和 this 指针

C++ null value and this pointer

我是C++新手,正在努力学习C++。我在 Java 中有这样一段代码:

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

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

这是我在 C++ 中的 header:

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 将 return 引用新的(或现有的)实例化列表。如果您决定放弃潜在实例化(我建议这样做),代码会变得相当简单:

class DiagnosticTroubleCode 
{
protected:
    std::list<std::string> diagnosticTroubleCode;

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

如果后者是可能的(坦率地说,我不明白它是如何不可能的),请先追求后者。在以上两种情况下,成员都是通过引用 return 编辑的,而不是值或地址。这与您可能熟悉的内容最为相似。

祝你好运。

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

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

#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;
}

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

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

关于this的事情。如果你想return一个成员变量,你真的不需要写return this.variable,你可以简单地return这个变量写return variable.

你可以使用这样的东西

#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();
            };

我想到了这个解决方案。