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;
}
如何比较 disgnosticTroubleCode
和 null
的值?并将其设置为新的 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& foo
或 List* 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,我们有 NULL
或 nullptr
。在 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();
};
我想到了这个解决方案。
我是C++新手,正在努力学习C++。我在 Java 中有这样一段代码:
public List<String> getDiagnosticTroubleCode() {
if (diagnosticTroubleCode == null) {
diagnosticTroubleCode = new ArrayList<String>();
}
return this.diagnosticTroubleCode;
}
如何比较 disgnosticTroubleCode
和 null
的值?并将其设置为新的 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& foo
或 List* 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,我们有 NULL
或 nullptr
。在 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();
};
我想到了这个解决方案。