【问题标题】:c++ access main objects from other filec ++从其他文件访问主要对象
【发布时间】:2015-01-14 00:34:50
【问题描述】:

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

main.cpp

#include"ClassA.h";
#include"ClassB.h";

int main()
{

  ClassA objectA;

  return 0;
}

ClassA.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;

 };

ClassB.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;
};

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

谢谢。

【问题讨论】:

  • 您遇到的错误是什么,您尝试过什么?
  • 从 C++ 语言的角度来看,您尝试做的事情没有意义。如果你能描述你想要解决的真正问题,可能会有办法。
  • 是的,我做到了,我无法从 classB 访问 objectA,我只能访问 ClassA.h 但这不会影响我的对象,因为我在没有 objectA.get 的情况下访问...
  • 您绝对应该添加#ifndef #define 和#endif 语句。大家好,你们会考虑子类和父类的继承

标签: c++ class oop object instantiation


【解决方案1】:

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

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

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

【讨论】:

  • 所以如果我做对了,我也需要在 main.cpp 中实例化我的所有对象在 main 函数中,并从那里通过引用任何方法(类 &objA),这就是它应该是,如果我的 objectA 有任何来自 classB 的依赖项,我将简单地从我的 main.cpp 调用该依赖项,例如: if(objectB.getValue() == true){ objectA.doSomething(); };
  • 或者它会是这样的: ClassB objB(ClassA &objA); , 并且在 ClassB 中有一个 //Declaration Class A;和 // 构造函数 ClassB(ClassA &objA); ?
  • 是的,如果 B 需要保存对 A 的引用,则将引用传递给 B 构造函数是一种好方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我不能 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;
    }
    

    虽然您的示例这种访问方式确实不是一个好主意,但不确定您为什么要这样做。

    【讨论】:

    • 感谢您的回复 好的 我注意到我做事的方式不是最好的,我正在学习 C++ 几天,我必须访问对象的想法是将它们定义为全局,但我知道这不是一个好习惯,所以我试图访问其中的对象但没有被定义为全局,这就是我的问题所在,我不知道如何访问对象这不是全球性的,有更简单的方法可以做到这一点吗?我在某处读到使用向量是一种好方法,但对向量知之甚少
    • 我刚刚向您展示了如何从 ClassB 访问 ClassA 而其中的任何一个都不是全局的。为了完全掌握您的目标,您将学习的不仅仅是 C++。尤其是当您只看到全局变量的形式时,这应该是您在开发过程中最远离您的想法。
    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多