You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个类/头文件间共享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 '()')

  1. 更新后新增错误:

'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:05:16