我是C++的新手,并且对Java和C#更加熟悉,因此,请得到您的帮助。

我有这种情况:我有一个抽象类SS,代表一种构造特定方案的方法。此方案使用内部类SSP,它是另一个抽象类。
原因是我可以对SS和SSP使用不同的实现,但是我希望它尽可能通用。

现在,SS的一种可能的实现是A,而SSP的相应实现是AP。所以,我有类似

class SSP {
  // abstract class
}

class SS {
  // abstract class
  SSP & my_p; // since this is an abstract member, I need a reference or a pointer here
  ...

  SS(SSP & p):
    my_p(p)
  {}
  ...

}

class AP : public SSP {
  int my_a;
  int my_b;

  AP(int a, int b):
    my_a = a, my_b = b
  {...}
}

class A : public SS {
  ...
  A(int a, int b):
    SS( AP(a,b) )
  {}
}

现在,令我烦恼的是这段代码让我觉得引用超出了范围。当我在A的构造函数中隐式创建AP时,该临时对象是否会在构造函数完成后立即销毁?如果是这样,那么A中my_p的值是否不确定?

使用指针和构造函数中的特定new的最佳方法是什么,还是有更好的方法?我希望引用my_p能持续到A本身的实例持续存在的时间。

顺便说一句,我这次必须将A类中的变量SSP和my_p重新声明为AP吗?

谢谢大家

最佳答案

如果您使用的是原始引用/指针,则您的类无法控制传入值的生存期。另外请注意,通过将引用用作类成员,您将强制使用“SS”类型的对象一旦构建,就不能为'm_p'设置不同的值。我建议使用指针而不是引用。

现在,绝对保证成员生存期的唯一方法是获取在构造函数中提供值时的所有权。您可以使用原始指针(和简单的书面契约(Contract))来执行此操作,或更优选地,可以使用诸如智能指针之类的语言功能来强制执行此契约(Contract)。无论哪种方式,分配都必须在其生命周期超过包含对象的生命周期的区域(堆或类似的区域,而不是堆栈)进行。

您使用shared_ptr重写了代码:

#include <iostream>
#include <memory>

using namespace std;
    class SSP {
      // abstract class
    };

    class SS {
      // abstract class
      std::shared_ptr<SSP> my_p; // since this is an abstract member, I need a reference or a pointer here
      // ...
      public:
      SS(std::shared_ptr<SSP> p):
        my_p(p)
      {}
      // ...

    };

    class AP : public SSP {
      int my_a;
      int my_b;
      public:
      AP(int a, int b):
        my_a(a), my_b(b)
      {//...
      }
    };

    class A : public SS {
      // ...
      A(int a, int b):
        SS(std::make_shared<AP>(a,b))
      {}
    };

int main() {
    // your code goes here
    return 0;
}

如果您的对象是指针的唯一所有者,则应考虑使用unique_ptr

10-06 07:38
查看更多