C++ 从其他文件访问主要对象

c++ access main objects from other file

本文关键字:对象 访问 文件 其他 C++      更新时间:2023-10-16

我想知道如何从另一个类访问在主函数中创建的对象。

主.cpp

#include"ClassA.h";
#include"ClassB.h";
int main()
{
  ClassA objectA;
  return 0;
}

A.h 级

#pragma once
class ClassA
{
  public:
  ClassA():_privateVar(100)
  {};
  ~ClassA()
  {};
  //Getters
  float getPrivateVarA(){ return _privateVarA; };
  //Setters
  void setPrivateVarA(float privateVarA){ _privateVarA = privateVarA; };
private:
  //Just a value
  float _privateVarA;
 };

班B.h

#pragma once
class ClassB
{
  public:
  ClassB():_privateVarB(50)
  { };
  ~ClassB()
  { };
  //This is what i´m trying to achieve: Acces objectA
  // like this:  objectA.getPrivateVarA(); or objectA.setPrivateVarA; 
  int getPrivateVarB(){return _privateVarB;};

private:
  int _privateVarB;
};

我整个星期都在寻找这个问题的答案,但一无所获......如果有人知道一些书或有任何关于我如何到达那里的信息,将不胜感激。

谢谢。

你把你的问题放在了 ClassB 声明的中间。您不能在那里执行代码。无论你做什么,都必须在函数内部完成。

可以定义 ClassB 中的函数,以便它接受指向 ClassA 的引用或指针。然后,该引用可用于调用 getPrivateVarA()。

换句话说,如果类 B 需要访问类 A,则由您的代码使用所需的引用初始化 B。 这可以在创建 B 对象或调用 B 对象的方法时完成。

objectA 在 main() 中具有函数局部范围。根据定义,只能在其可见范围内直接访问对象。这就是C++的意义所在。

当然,如果将指向此对象的引用或指针传递给其他某个函数,则该其他函数可以通过指针或引用间接访问实例化的对象。

我不能100%肯定地说你不能,但你绝对不应该这样做。如果要使用在不同作用域中创建的对象,则需要通过值、引用或指针将其传递到要从中访问它的作用域中。

甲等舱:

class A {
public:
    ClassA() : _privateVar(100) {}
    ~ClassA() {}
    float getPrivateVarA() { return _privateVar; }
    void setPrivateVarA(float val) { _privateVar = val; }
private:
    float _privateVar;
};

头等舱B:

class B {
public:
    ClassB() : _privateVar(50) {}
    ~ClassB() {}
    // by copy
    float getPrivateVarB_byCopy(ClassA a) {
        return _privateVar + a.getPrivateVarA();
    }
    // by reference
    float getPrivateVarB_byRef(ClassA &a) {
        return _privateVar + a.getPrivateVarA();
    }
    // by pointer
    float getPrivateVarB_byPointer(ClassA *a) {
        return _privateVar + a->getPrivateVarA();
    }
    float setPrivateVarB(float val) { _privateVar = val; }
private:
    float _privateVar;
};

现在是主要的。

int main(void) {
    ClassB b;
    ClassA a; // for copy and ref
    ClassA *a2 = new ClassA(); // for pointer
    b.getPrivateVarB_byCopy(a); // => 150
    b.getPrivateVarB_byRef(a); // => 150
    b.getPrivateVarB_byPointer(a2); // => 150
    delete a2; // clean up pointer
    return 0;
}

尽管您的示例这种类型的访问确实不是一个好主意,但不确定为什么要以这种方式执行操作。