C++空值和此指针
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
一样使用。然后我想返回对象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++我们没有空,我们有NULL
或nullptr
.在C++对象不能真正为空,因为它不是。对象在构造时会占用内存块,因此它永远不会为 null。因此,请尝试熟悉指针并将其用于您的优势。
关于this
.如果要返回成员变量,其实不需要写return this.variable
,只需写return variable
即可返回变量。
这里的区别在于,在Java中,所有复杂的结构声明实际上是对此类结构的引用的声明。在C++,这相当于说List& foo
或List* 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();
};
我想出了这个解决方案。
- 错误:在为指针赋值时,void值没有被忽略
- 关于 c++ 函数中指针赋值的简单问题
- 将函数参数完美转发到函数指针:按值传递呢?
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 使用 const char* 键映射 C++ 检索空值
- "this"指针的值在对象的生存期内是否恒定?
- 如何读取指针的值,因为这个指针是函数的返回?
- 返回空值的字符串值
- boost::any 如何检查空值/未定义的值
- C++ - 无法从基类继承 |提供空值
- C++空值和此指针
- 使用 cin 或 getline() 输入空值
- 可变参数列表是否以空值终止?
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- (C++) 检查指针数组中的空值
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- Do C和C++标准意味着地址空间中必须只存在一个特殊值来表示空指针的值
- 指针指向0x1 - 正在检查空值是否有效
- 这段代码有什么问题?似乎指针突然指向空值
- 我给一个指针赋值,它把自己空了