【发布时间】:2016-01-12 08:42:42
【问题描述】:
现在我有以下代码:
class Env
{
public:
int ra(){ return a;}
int rb(){ return b;}
private:
int a;
int b;
};
class CEnv: private Env
{
public:
static Env* Instance()
{
CEnv* pEnv = new CEnv;
return pEnv;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Env* pEnv = CEnv::Instance();
pEnv->ra();
return 0;
}
而且效果很好。稍后我添加一些代码。
class Env
{
public:
int ra(){ return a;}
int rb(){ return b;}
private:
int a;
int b;
};
class CEnv: private Env
{
public:
static Env* Instance()
{
CEnv* pEnv = new CEnv;
return pEnv;
}
};
Env* test()
{
CEnv *p = new CEnv;
return p;
}
int _tmain(int argc, _TCHAR* argv[])
{
Env* pEnv = CEnv::Instance();
pEnv->ra();
return 0;
}
然后VS2010会告诉编译器错误: 错误 C2243:“类型转换”:存在从“CEnv *”到“Env &”的转换,但无法访问。
在我看来,显示错误是正确的,因为如果使用私有继承,它就不是一种关系。 但是第一个 Code Pattern 运行良好。 我想知道为什么?
【问题讨论】:
-
"而且效果很好"不,它没有。
-
在我的vs2010中,确实运行良好。您的计算机中显示了哪个错误?
-
static Env& Instance() { CEnv env; return env; }- 您不能返回对自动堆栈托管变量的引用并期望它能够可靠地工作。这是未定义的行为,将在任何介绍性 C++ 书籍中介绍。现有的数百个 SO Q&A 讨论了这一点:搜索 “C++ 返回对局部变量的引用”。请注意,创建函数static确实不 会创建变量static。 -
@xin 阅读How to Ask。这不是一个讨论论坛。您不能在现有问题中发布后续问题,更不用说现有问题的 cmets...
-
你不应该从你的问题中删除原始代码 - 现在没有人知道你在问什么或者为什么现有的 cmets 和答案会讨论你所犯的错误。