Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参考资料:我会超出范围吗? 我是C++新手,更习惯于java和C语言,所以我需要你的帮助。_C++_Reference_Scope_Temporary - Fatal编程技术网

参考资料:我会超出范围吗? 我是C++新手,更习惯于java和C语言,所以我需要你的帮助。

参考资料:我会超出范围吗? 我是C++新手,更习惯于java和C语言,所以我需要你的帮助。,c++,reference,scope,temporary,C++,Reference,Scope,Temporary,我有这样一种情况:我有一个抽象类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 nee

我有这样一种情况:我有一个抽象类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) )
  {}
}
现在,这段代码让我感到困扰的是,我会得到一个超出范围的引用。当我在的构造函数中隐式创建AP时,这是一个临时对象吗?它将在构造函数完成后立即销毁?如果是这样的话,那么A中my_p的值是否未定义

在构造函数中使用指针和特定的new,最好的方法是什么,或者有更好的方法吗?我希望引用my_p的持续时间与A实例本身的持续时间一样长

顺便问一下,我是否必须在类A中重新声明变量SSP和my_p,这次是AP


谢谢大家。

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

现在,绝对保证成员生存期的唯一方法是在构造函数中提供值时获得该值的所有权。您可以使用原始指针(和简单的书面契约)来实现这一点,或者更可取的是,使用诸如智能指针之类的语言特性来实施此契约。无论哪种方式,分配都需要在生存期超过包含对象的生存期的竞技场(堆或类似的,但不是堆栈)中进行

使用
共享\u 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;
}

#包括
#包括
使用名称空间std;
SSP类{
//抽象类
};
SS类{
//抽象类
std::shared_ptr my_p;//因为这是一个抽象成员,所以这里需要一个引用或指针
// ...
公众:
SS(标准::共享\u ptr p):
我的p(p)
{}
// ...
};
AP类:公共SSP{
int my_a;
int my_b;
公众:
AP(内部a、内部b):
我的a(a),我的b(b)
{//...
}
};
甲级:公共服务{
// ...
A(整数A,整数b):
SS(标准:共享(a、b))
{}
};
int main(){
//你的密码在这里
返回0;
}


如果你的对象是指针的唯一拥有者,你应该考虑使用<代码> UnQuyPPTR 。< /P>你是对的,因为临时对象将被破坏,并且你的引用变得悬空。如果您想在更多的SS实例之间共享您的SSP,您必须进行手动管理,或者使用

std::shared\u ptr
。如果您的SSP对于SS实例来说是唯一的,那么您需要
std::unique\u ptr
@Xarn我们所有人都会遇到这种情况!谢谢,这是一个很好的解决方案,我试着去实现它。不幸的是,我似乎无法让g++在C+11模式下编译:它不知道shared_ptr或unique_ptr,所以我使用了原始指针。我使我的p成为指向SSP的常量指针,并包含了一个删除它的析构函数。我希望这足以让我摆脱麻烦,但你永远不会知道指针。