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

多个A类实例共享单个B类实例的C++指针使用问题求助

问题分析与解决方案

你的代码确实存在指针处理错误,导致了未定义行为,具体原因和优化方案如下:

问题根源:野指针导致的随机结果

A类构造函数的参数是B b,这是值传递——每次创建A实例时,都会生成obj_b的临时拷贝。构造函数执行完毕后,这个临时拷贝会被销毁,你存在bptr里的地址就变成了无效内存(野指针)。后续通过该指针访问getfoo()时,内存未被覆盖就返回正确值,被覆盖则返回错误值,所以结果时对时错。

优化实现方案

方案1:使用const引用持有B实例(推荐)

既避免拷贝,又通过const限定保证A无法修改B的数据:

#include <iostream>
using namespace std;

class B{
private:
    int foo = 9;
public:
    int getfoo() const { return foo; } // 加const,允许const引用调用
};

class A {
private:
    const B& b_ref; // 用const引用持有原B实例

public:
    A(const B& b) : b_ref(b) {} // 初始化列表初始化引用
    int getfoo() { return b_ref.getfoo(); }
};

int main () { // 标准C++要求main返回int
    B obj_b;
    A A1(obj_b);
    A A2(obj_b);
    A A3(obj_b);  

    cout << A1.getfoo() << endl;
    cout << A2.getfoo() << endl;
    cout << A3.getfoo() << endl;
    return 0;
}

方案2:使用const指针持有B实例

如果偏好指针写法,直接传递原对象的地址,并通过const限制修改:

#include <iostream>
using namespace std;

class B{
private:
    int foo = 9;
public:
    int getfoo() const { return foo; }
};

class A {
private:
    const B* b_ptr;

public:
    A(const B* b) : b_ptr(b) {} // 接收原对象地址
    int getfoo() { return b_ptr->getfoo(); }
};

int main () {
    B obj_b;
    A A1(&obj_b); // 传入原对象地址
    A A2(&obj_b);
    A A3(&obj_b);  

    cout << A1.getfoo() << endl;
    cout << A2.getfoo() << endl;
    cout << A3.getfoo() << endl;
    return 0;
}

额外注意事项

  • 标准C++中main函数必须返回int,void main属于非标准写法。
  • B类的getfoo函数需加const修饰,确保能被const引用/指针调用。
  • 原代码中的count是笔误,应改为cout。

内容的提问来源于stack exchange,提问作者Robert M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:20:18