c++值传递,多个class值的引用

C++值传递
damo.h

typedef struct DoInfo {...}
typedef struct ReInfo {...}
typedef struct PrInfo {...}
class model{
const DoInfo& getDoInfo();//获取DoInfo中的数据

const ReInfo& getReInfo();

const PrInfo& getPrInfo();
}

acoe.h

#include "damo.h"
clas core{
model _model;
...
}
//获取所有_model中的数据

//需要acoe.h文件把_model数据传到cust.h文件中,类cusA和cusB都需要访问_model数据,
//不采用 把model 声明成单例直接调用,extern model实例也不用
cust.h

//cust.h文件不能直接 #include "damo.h"
//acoe.h文件获取damo.h中的数据_model,这一步好实现
//主要是初始化时acoe.h文件把_model传到cust.h文件,cusA和cusB都可以使用传进来的这些数据
class  cusA{...}
class  cusB{...}


参考GPT和自己的思路,可以将_model作为参数分别传递给cusA和cusB的构造函数,或者设置对应的set函数,让cusA和cusB在使用_model数据之前,先通过构造函数或set函数将_model传递进来。

例如,在cusA中可以这样实现:

#include "damo.h"
#include "acoe.h"

class cusA {
public:
    cusA(const model& modelRef) : _model(modelRef) {}
    void someFunction() {
        const DoInfo& doInfo = _model.getDoInfo();
        const ReInfo& reInfo = _model.getReInfo();
        // 使用获取到的数据
    }
private:
    const model& _model;
};

在acoe.h中,创建cusA对象时将_model传递进去:

#include "cust.h"

class acoe {
public:
    acoe() {
        cusA cusAInstance(_model);
        cusB cusBInstance(_model);
        // 使用cusAInstance和cusBInstance
    }
private:
    model _model;
};

cusB的实现与cusA类似,这里不再赘述。
如果对您有帮助,请给与采纳,谢谢。

该回答引用GPTᴼᴾᴱᴺᴬᴵ

根据您提供的代码,我看到您想要在不使用单例模式或全局变量的情况下在不同的类之间传递数据。这可以通过将_model对象作为参数传递给cusA和cusB类的构造函数来实现,或者将其作为类成员变量存储在这些类中。

以下是示例代码,其中_model作为参数传递给cusA和cusB类的构造函数:
在cust.h文件中:

#include "acoe.h"
class cusA {
public:
  cusA(const model& m) : _model(m) {}
private:
  const model& _model;
  // 这里可以定义 cusA 类的其他成员变量和方法
};

class cusB {
public:
  cusB(const model& m) : _model(m) {}
private:
  const model& _model;
  // 这里可以定义 cusB 类的其他成员变量和方法
};

在您的代码中,可以使用以下方式创建cusA和cusB对象:

model m;
// 初始化 m 对象的数据

cusA a(m);
cusB b(m);

这样,cusA和cusB对象都可以访问_model中的数据。

_model就是指class model吗?
你到底想要得到一个什么结果?
总体描述云里雾里

该回答引用ChatGPT

如遇到问题可以回复我

方法1
您可以在 acoe.h 中将 _model 数据传递给 cust.h,并在 cusA 和 cusB 类中访问这些数据。以下是一种可能的实现方式:

// acoe.h
#include "damo.h"
#include "cust.h"

class core {
  model _model;
  cusA _cusA;
  cusB _cusB;
public:
  core() {
    const DoInfo& doInfo = _model.getDoInfo();
    const ReInfo& reInfo = _model.getReInfo();
    const PrInfo& prInfo = _model.getPrInfo();
    _cusA.init(doInfo, reInfo, prInfo);
    _cusB.init(doInfo, reInfo, prInfo);
  }
  // ...
};

// cust.h
#include "damo.h"

class cusA {
  const DoInfo* _doInfo;
  const ReInfo* _reInfo;
  const PrInfo* _prInfo;
public:
  void init(const DoInfo& doInfo, const ReInfo& reInfo, const PrInfo& prInfo) {
    _doInfo = &doInfo;
    _reInfo = &reInfo;
    _prInfo = &prInfo;
  }
  // ...
};

class cusB {
  const DoInfo* _doInfo;
  const ReInfo* _reInfo;
  const PrInfo* _prInfo;
public:
  void init(const DoInfo& doInfo, const ReInfo& reInfo, const PrInfo& prInfo) {
    _doInfo = &doInfo;
    _reInfo = &reInfo;
    _prInfo = &prInfo;
  }
  // ...
};

在这个实现中,core 类中的构造函数调用了 model 类的三个方法以获取 DoInfo、ReInfo 和 PrInfo 数据,并将它们传递给 cusA 和 cusB 类的 init() 方法。在 init() 方法中,我们将这些数据的指针保存到 cusA 和 cusB 类的成员变量中。这样,cusA 和 cusB 类就可以访问 DoInfo、ReInfo 和 PrInfo 数据了。

请注意,由于 DoInfo、ReInfo 和 PrInfo 都是通过值传递的方式传递给 cusA 和 cusB 类的,因此在 cusA 和 cusB 类中访问这些数据时,应该使用指向常量的指针(例如 const DoInfo*)而不是引用(例如 const DoInfo&)。这是因为指针的值可以被修改,但指向的对象不能被修改,这样可以避免意外修改原始数据。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

方法2
假设您的问题是如何将一个模型对象(model)的数据传递给多个客户类(cusA 和 cusB),并且您不想将客户类和模型类直接耦合在一起,或者将模型类设置为单例。

如果我的理解是正确的,您可以在客户类构造函数中传递一个指向模型对象的常量引用,以在客户类中访问模型数据。这样,客户类就不需要包含 damo.h 头文件来访问模型数据,也不需要了解模型对象的具体实现。以下是示例代码:

// acoe.h
#include "damo.h"
class core {
  model _model;
  cusA _cusA;
  cusB _cusB;
public:
  core() : _cusA(_model), _cusB(_model) {}
  // ...
};

// cust.h
class cusA {
  const DoInfo& _doInfo;
  const ReInfo& _reInfo;
  const PrInfo& _prInfo;
public:
  cusA(const model& model) :
    _doInfo(model.getDoInfo()), _reInfo(model.getReInfo()), _prInfo(model.getPrInfo()) {}
  // ...
};

class cusB {
  const DoInfo& _doInfo;
  const ReInfo& _reInfo;
  const PrInfo& _prInfo;
public:
  cusB(const model& model) :
    _doInfo(model.getDoInfo()), _reInfo(model.getReInfo()), _prInfo(model.getPrInfo()) {}
  // ...
};

在上述代码中,客户类的构造函数接受一个指向模型对象的常量引用,并从模型对象中获取所需的数据(DoInfo、ReInfo 和 PrInfo)。这些数据存储在客户类中的常量引用成员变量中,供客户类中的其他成员函数使用。在 core 类的构造函数中,客户类的对象被创建,并传递给客户类的构造函数一个指向模型对象的常量引用。这样,客户类就可以访问模型数据,而不需要了解模型对象的具体实现。

https://www.baidu.com/link?url=V0g5hPqoz6Zzh4kOpSeMOGPViHTPANVYPsC_Cp9GcuyT-0g7LnAwziGaPKRNEB3cGkv8T5-W6fZ3lhhX8KMD8an9Ucqv9nSVvw3jWNzq1LC&wd=&eqid=d750b1660000a0b80000000263f46608

以下答案基于ChatGPT与GISer Liu编写:

如果您想知道如何在 acoe.h 文件中访问 model 类中的数据,并将其传递给 cusA 和 cusB 类。同时,cust.h 文件不能直接包含 damo.h。

1.您可以在 acoe.h 文件中声明 model 类,以便您可以访问其中的数据。您可以使用 #include 将 damo.h 头文件包含到 acoe.h 文件中,以便您可以使用 model 类型作为成员变量。
2.然后,在 acoe.h 中创建一个 model对象并调用其方法 getDoInfo(), getReInfo(), getPrInfo()获取数据。接着,将这些数据传递给 cusA和 cusB 类的构造函数。

下面是示例代码:

acoe.h

// acoe.h

// 包含需要的头文件
#include "damo.h"
#include "cus.h"

class acoe {
public:
    acoe() {
        // 创建 model 对象
        model m;
        
        // 获取数据
        const DoInfo& doInfo = m.getDoInfo();
        const ReInfo& reInfo = m.getReInfo();
        const PrInfo& prInfo = m.getPrInfo();

        // 创建 cusA 和 cusB 对象,并将数据传递给它们的构造函数
        cusA a(doInfo, reInfo);
        cusB b(prInfo);
    }
private:
    // 声明 model 类型成员变量
    model _model;
};

cus.h

// cus.h

// 不包含 "damo.h" 头文件

class cusA {
public:
    cusA(const DoInfo& doInfo, const ReInfo& reInfo) {
        // 使用传递进来的 doInfo 和 reInfo 数据
    }
};

class cusB {
public:
    cusB(const PrInfo& prInfo) {
        // 使用传递进来的 prInfo 数据
    }
};

这样,您可以在 acoe.h 文件中访问 model 类的数据,并将其传递给 cusAcusB 类,同时在 cus.h 文件中避免了包含 damo.h 头文件。


首先,你可以在core类中创建一个model对象,并使用getDoInfo(),getReInfo()和getPrInfo()函数来获取model对象中的数据。然后,你可以将这些数据传递给cusA和cusB类的对象。这可以通过类构造函数、成员函数或者全局函数实现,具体实现方式取决于你的需求。
其次,如果你的model类只是用于存储数据,那么你可以将其声明为一个命名空间,并将其数据成员声明为全局变量。这样,所有的类都可以通过包含该命名空间来访问这些数据。
最后,你可以将model类声明为单例模式,以确保在整个程序中只有一个model对象。这可以通过实现私有构造函数、私有复制构造函数和私有赋值操作符来实现。然后,你可以在core类和cusA和cusB类中使用单例model对象来访问数据。

了解一下什么叫“XY问题”,感觉你问的有点不明所以

如果是要让头文件不暴露实现,可以头文件里不包含,在cpp文件里包含

//xxx.h
class A{
public:
    A();
   ~A();
    void run();
private:
    void* impl;
}

//xxx.cpp
#include "B.h"

A::A(){
   impl = new B();
}
A::~A(){
   delete (B*)impl;
}
void  A::run(){
  //这里就能访问到B类的对象
}

acoe.h

#include "damo.h"
#include "cust.h"

class acoe {
public:
    acoe() : _model() {}

    void run() {
        cusA a(_model);
        cusB b(_model);

        // Do something with a and b...
    }

private:
    model _model;
};


cusA.h

#include "damo.h"

class cusA {
public:
    cusA(const model& m) : _doInfo(m.getDoInfo()), _prInfo(m.getPrInfo()) {}

    // Use _doInfo and _prInfo as needed...

private:
    const DoInfo& _doInfo;
    const PrInfo& _prInfo;
};

cusB.h

#include "damo.h"

class cusB {
public:
    cusB(const model& m) : _reInfo(m.getReInfo()), _prInfo(m.getPrInfo()) {}

    // Use _reInfo and _prInfo as needed...

private:
    const ReInfo& _reInfo;
    const PrInfo& _prInfo;
};