【问题标题】:Can we store the class object and not just the pointer to that object我们可以存储类对象而不仅仅是指向该对象的指针吗
【发布时间】:2020-12-06 10:42:25
【问题描述】:

我试图将类对象存储在一个文件中,但由于该类包含一个指针向量,这会导致问题,因为下次我访问该类时,我能够获取除此向量之外的所有内容。

typedef vector<pair<int, MBR *>> vppint;

class Node{
private:
  int id;
  int parentID;
  int total_children;
  MBR *mbr;
  vppint children;
public:
  vppint fetchChildren(){
    return return this->children;
  }

  int totalChildren(){
    return this->total_children;
  }
};

MBR 是一些类。

在将这个 Node 类存储在文件中然后读取它之后。 fetchChildren 函数抛出分段错误,原因很明显。有什么方法可以存储对象而不仅仅是指针。

【问题讨论】:

  • 我错过了什么或者为什么类定义了两次?
  • 问题是,你有充分的理由使用指针吗?
  • 不,我不想在这里使用指针。我只知道这种存储值的方式,所以我使用了它。如果可能,我想存储整个类对象。
  • 那就不要使用了,直接丢掉指针,对象会被保存。
  • 您使用什么代码将其保存到文件中?你需要一个序列化库。

标签: c++ database c++11 pointers segmentation-fault


【解决方案1】:

在 C++ 中,如果您想创建/销毁类的实例,您可以使用构造函数和析构函数(我相信这些不是必需的,但它可以帮助您了解它的工作原理)。

您可以通过在节点类中声明一个公共构造函数来做到这一点。然后声明函数。 Node::Node() {} 在我们的例子中是空的。

class Node{
private:
  int id;
  int parentID;
  int total_children;
  MBR *mbr;
  vppint children;
public:

  Node();
  vppint fetchChildren(){
    return return this->children;
  }

  int totalChildren(){
    return this->total_children;
  }
};

如果你有一个可以初始化值的构造函数(或者如果你不想使用构造函数),你可以简单地存储类对象:

Node savedObject = Node(); // Creates an instance of the Node class.

如果这是您想要实现的目标,我建议您阅读以下内容:https://www.w3schools.com/cpp/cpp_constructors.asp 了解更多信息。

【讨论】:

  • Node savedObject = Node(); // Creates an instance of the Node class. 从技术上讲,创建 Node 类的实例所需的只是Node savedObject;
  • @AlgirdasPreidžius 但在尝试访问其任何成员时,未初始化的Node 不会导致nullpointer
  • "但不会是未初始化的Node" 未初始化是什么意思? Node savedObject; 调用 Node 的默认构造函数。 “在尝试访问其任何成员时导致nullpointer”当savedObject 是一个值时,nullpointer 会在哪里?
  • @AlgirdasPreidžius 那是我的错,我一定是把 Java 搞混了。你是对的。
【解决方案2】:

那是 C++。到目前为止,您必须编写自己的序列化逻辑来正确处理指针。你可以看看boost::serialization,它提供了很多辅助功能。请注意,boost::serialization 使您的序列化工具输出平台依赖。如果您想要跨平台序列化,您必须在序列化逻辑上投入更多精力,或者使用protobuf 之类的东西。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2021-08-25
    • 2010-09-13
    • 2021-08-05
    • 2021-07-14
    • 1970-01-01
    • 2021-05-20
    • 2023-02-09
    相关资源
    最近更新 更多