如何删除课程的一部分?

问题描述 投票:2回答:2

问题很简单。我有一个可以按如下结构进行构造的类:

class MyClass {
  struct A {
    // ...
  };
  struct B {
    // ...
  };
};

问题是:MyClass::B中的信息在经过一段时间的预计算后是无用的,而MyClass::A绝不能删除(程序可能运行了几天)。 MyClass::B拥有大量信息。我想摆脱MyClass::B的同时将MyClass::A保留在相同的存储位置。

是否有可能在不修改太多数据结构的情况下且不必向MyClass::A添加其他任何内容(特别是指向MyClass::B的指针)?如果是这样,实施它的正确方法是什么?考虑到该程序必须尽可能地提高内存效率(让我们将其发挥到极致)。我使用C ++ 14 BTW。

(还有一个额外的问题:是否可以从MyClass::B中删除与MyClass相对应的块?]

c++ oop
2个回答
0
投票
“ B的生命与MyClass的生命息息相关,或者它是独立的。在后一种情况下,您必须以某种方式对其进行跟踪”。

将上下文从问题中放回去:

经过一段时间的预计算后,MyClass :: B没有用。

    绝对不能删除MyClass :: A。
  • 因此,您需要以某种方式对其进行跟踪。怎么样?好吧,这取决于生命周期的规则。
  • [如果B有时可能存在,有时不取决于难以控制的(或无知的)情况,那么有一个指向它的指针,当它无用时将其设置为nullptr,而当它有用时则进行动态分配,唯一的解决方案。

    • 但是我们在这里有了更多的知识:B首先存在,然后变得毫无用处,并且一直保持下去。换句话说,在用于创建A的一些初始
    • 构建步骤
    之后,您不需要B。

    [有一种模式可以做到这一点:builder pattern。它的目的是封装一个复杂的构建操作,可能跟踪某个状态,直到它构建了某个对象为止,此时它变得无用并可以被破坏。

    class ABuilder { public: setSomeInfo(int); doSomeComputation(......); // etc A get(); /// finalize building of A private: int someInfo_ = 0; }; // somewhere else auto b = ABuilder(); b.setSomeInfo(42); b.doSomeComputation(......); auto a = b.get(); // b is no longer used past that point // delete it if it was allocated dynamically // or let it go out of scope if it was automatic

    在您的示例中,它的映射方式如下:

    [A仍为A

      [BABuider
    • 不需要MyClass
    © www.soinside.com 2019 - 2024. All rights reserved.