C++:如何在类成员函数中访问构造函数传入的Boo结构体成员?
问题:如何在MyClass的Method中访问Boo结构体的theDataINeed?
我在类外部定义了如下结构体:
struct Boo : public otherClass { public: const float theDataINeed; }; class MyClass { public: MyClass(); MyClass(const Boo& Setup); protected: void Method(); };
这种结构较为特殊,通过第二个构造函数关联到MyClass的Boo结构体实例没有永久命名。我尝试在MyClass的Method()中访问theDataINeed,但直接使用theDataINeed或Setup.theDataINeed均失败(Setup仅为构造函数参数,并非类的永久成员)。构造函数实现如下:
MyClass::MyClass(const Boo& Setup) : otherClass(Setup) { }
想请教正确的访问语法是什么?
解答
核心问题是你的MyClass没有保存Boo实例的相关数据:
Setup只是构造函数的临时参数,构造函数执行完毕后就会被销毁,无法在后续的Method()中访问MyClass仅继承自otherClass,并没有继承Boo,而theDataINeed是Boo独有的成员,不是otherClass的一部分,所以直接调用theDataINeed会找不到该成员
有两种可行的解决方式:
方式1:在MyClass中存储单个需要的成员值
如果只需要theDataINeed这一个值,可以在MyClass中添加对应的成员变量,在构造时直接保存该值:
class MyClass { public: MyClass(); MyClass(const Boo& Setup); protected: void Method(); private: const float m_theDataINeed; // 添加成员变量存储需要的值 }; // 构造函数初始化列表中赋值 MyClass::MyClass(const Boo& Setup) : otherClass(Setup), m_theDataINeed(Setup.theDataINeed) { } // 在Method中直接访问 void MyClass::Method() { // 使用m_theDataINeed即可,比如: float value = m_theDataINeed; }
方式2:在MyClass中保存Boo实例的引用或拷贝
如果后续可能需要访问Boo的其他成员,可以直接保存整个Boo实例:
- 如果能保证传入的Boo实例生命周期比MyClass长,可以保存引用:
class MyClass { public: MyClass(); MyClass(const Boo& Setup); protected: void Method(); private: const Boo& m_boo; // 保存Boo的引用 }; MyClass::MyClass(const Boo& Setup) : otherClass(Setup), m_boo(Setup) { } void MyClass::Method() { float value = m_boo.theDataINeed; }
- 如果无法保证生命周期,或者需要独立的实例,可以保存拷贝:
class MyClass { public: MyClass(); MyClass(const Boo& Setup); protected: void Method(); private: Boo m_boo; // 保存Boo的拷贝 }; MyClass::MyClass(const Boo& Setup) : otherClass(Setup), m_boo(Setup) { } void MyClass::Method() { float value = m_boo.theDataINeed; }
内容的提问来源于stack exchange,提问作者DSiegmeyer
相关产品推荐
相关产品推荐

