我正在创建一个C ++类A,该类具有对象成员变量B,默认情况下不应实例化该成员变量。我不喜欢使用指针语法,因为类B在operator()中依赖很多,并且代码变得如此混乱。
为了将引用用作成员变量,但是每次我想通过引用访问对象时,都会遇到分段错误。
有可能使这项工作吗?
class SomeClass {
public:
SomeClass(int argToInitSomeOtherClass);
void someOtherFunction();
private:
std::shared_ptr < SomeOtherClass > MemberObject;
SomeOtherClass & MemberObjectReference = * MemberObject;
};
class SomeOtherClass {
public:
SomeOtherClass(int initArg) {
this - > member = initArg;
};
void whatever() {}; // I do nothing
private:
int member;
};
SomeClass::SomeClass(int argToInitSomeOtherClass) {
MemberObject = std::make_shared < SomeOtherClass > (argToInitSomeOtherClass)
}
void SomeClass::someOtherFunction() {
MemberObjectReference.whatever(); // Segmentation fault
}
如果有一种方法可以以非静态的方式保存成员对象并在没有默认值的情况下实例化它,也可以解决我的问题,但是我认为这是不可能的。
我不确定OP到底打算实现什么。
我会寻找另一种设计,因为在我看来,OP的方法脆弱且易于在源代码更改最少的情况下中断。
但是,OP的实际错误是恕我直言,构造函数中的错误初始化:
共享指针初始化后必须获取引用。另外,我使共享指针const
发出警告,以确保一旦重新分配共享指针,它就会中断(引用将变得悬而未决)。(这样const
会使尝试成为编译器错误。)
无论是通过原始指针还是通过智能指针指向指针,都应谨慎考虑指针的寿命。C ++中的引用本身并不执行此操作–这是作者的责任。
OP的固定示例:
#include <memory>
#include <iostream>
struct SomeOtherClass {
int member;
explicit SomeOtherClass(int initArg = 0): member(initArg) { }
void whatever() { std::cout << "SomeOtherClass::member: " << member << '\n'; }
};
class SomeClass {
public:
explicit SomeClass(int argForOther);
SomeClass(const SomeClass&) = delete;
SomeClass& operator=(const SomeClass&) = delete;
void someOtherFunction();
private:
const std::shared_ptr<SomeOtherClass> MemberObject;
SomeOtherClass &MemberObjectReference;
};
SomeClass::SomeClass(int argForOther):
MemberObject(std::make_shared<SomeOtherClass>(argForOther)),
MemberObjectReference(*MemberObject)
{ }
void SomeClass::someOtherFunction()
{
MemberObjectReference.whatever(); // Segmentation fault fixed
}
int main()
{
SomeClass someClass(123);
someClass.someOtherFunction();
return 0;
}
输出:
SomeOtherClass::member: 123
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句