两个类/头文件间共享std::shared_ptr的编译错误求助
两个类之间共享对象的编译错误排查与解决
我有两个头文件/类,希望在它们之间共享一个对象,因无法展示实际工作代码,简化示例如下:
HeaderInitial.h
class HeaderInitial { public: std::shared_ptr<AnotherClass> ClassObject; }
HeaderInitial.cpp
void function() { ClassObject->randomCall(); }
HeaderShared.h
class HeaderShared { public: std:shared_ptr<AnotherClass> ClassObject2(ClassObject); }
HeaderShared.cpp
void function() { ClassObject2->randomCall(); }
编译错误
invalid use of member function 'ClassObject2->randomCall()' (did you forget the '()')
- 更新后新增错误:
'ClassObject' has not been declared
错误原因与修复方案
1. 解决'ClassObject' has not been declared错误
- 原因:
HeaderShared.h中引用了HeaderInitial类的成员ClassObject,但未提前声明或包含HeaderInitial的头文件,编译器无法识别ClassObject;同时存在语法错误:std:shared_ptr少了一个冒号,应为std::shared_ptr。 - 修复:在
HeaderShared.h中前置声明HeaderInitial,修正std::shared_ptr的写法。
2. 解决invalid use of member function错误
- 原因:
HeaderShared中ClassObject2(ClassObject)的写法完全错误,编译器会将其识别为成员函数而非成员变量;另外两个.cpp中的function是全局函数,直接访问类的非静态成员变量不符合C++语法(类成员属于实例,必须通过对象访问)。
修复后的完整代码示例
HeaderInitial.h
// 前置声明AnotherClass,避免不必要的头文件包含 class AnotherClass; class HeaderInitial { public: std::shared_ptr<AnotherClass> ClassObject; // 构造函数初始化共享对象 HeaderInitial() : ClassObject(std::make_shared<AnotherClass>()) {} // 将function改为类的成员函数 void function(); };
HeaderInitial.cpp
#include "HeaderInitial.h" #include "AnotherClass.h" // 需包含AnotherClass的头文件,以调用成员函数 void HeaderInitial::function() { ClassObject->randomCall(); }
HeaderShared.h
// 前置声明HeaderInitial和AnotherClass class HeaderInitial; class AnotherClass; class HeaderShared { public: std::shared_ptr<AnotherClass> ClassObject2; // 通过构造函数接收HeaderInitial实例,共享其ClassObject HeaderShared(HeaderInitial& initial) : ClassObject2(initial.ClassObject) {} // 将function改为类的成员函数 void function(); };
HeaderShared.cpp
#include "HeaderShared.h" #include "HeaderInitial.h" #include "AnotherClass.h" void HeaderShared::function() { ClassObject2->randomCall(); }
使用方式
// 在调用处创建实例,实现对象共享 HeaderInitial initialObj; HeaderShared sharedObj(initialObj); initialObj.function(); sharedObj.function(); // 两个类调用的是同一个AnotherClass对象
内容的提问来源于stack exchange,提问作者bilumer
相关产品推荐
相关产品推荐

