【问题标题】:Accessing class variables in C++ [duplicate]在 C++ 中访问类变量 [重复]
【发布时间】:2012-10-05 12:59:57
【问题描述】:

可能重复:
Accessing Class Veriables in C++

您好,我在 C++ 中有以下类层次结构

Class1 {  
    vector<Class2> vecClass2;  
}  

Class2 {  
    private:  
        const Class1 * ptrClass1;  
        vector<Class3> vecClass3;  
    public:  
        Class2(const Class1 * ptrClass1);  
        int intC2publicVar;  
        string strC2publicVar;  
}  

Class3 {  
    private:  
        const Class2 * ptrClass2;  
        vector<Class4> vecClass4;  
    public:  
        Class3(const Class2 * ptrClass2);  
}  

Class4 {  
    private:  
        const Class3 * ptrClass3;  
        vector<Class5> vecClass5;  
    public:  
        Class4(const Class3 * ptrClass3);  
        void class4Method() const;  
} 

在 class4Method() 中我正在做这样的事情:

void Class4::class4Method() const {  
    const Class2 * pC2 = ptrClass3->ptrClass2;  
    int valClass2 = pC2->intC2publicVar;  
    //Above value is giving wrong value, I have no idea from where it is fetching the wrong value  

    string strVatClass2 = pC2->strC2publicVar;  
    //Above line of code cause run time termination of code and programs stops as soon as this line executes.  

    const Class2 c2 = * pC2;  
    //Above line of code cause run time termination of code and programs stops as soon as this line executes.  

}

我不知道为什么在 Class4 的 class4Method() 中会发生这种情况。请帮我解决这个问题。我的整个项目都因为这个问题而受到打击,如果不解决它,我就无法继续前进。

【问题讨论】:

  • 数据成员指针初始化了吗?
  • 你方法的第一行:const Class2 * pC2 = ptrClass3-&gt;ptrClass2;你访问Class3的私有成员。这不应该编译。从运行时的角度来看,之后的任何事情都没有实际意义。
  • @DanishAltafSatti 我的猜测是您正在创建指向局部变量的指针,这可以解释为什么值在构造函数中正确打印,但在您发布的代码中没有正确打印。但是没有看到更多代码,只是猜测。
  • 如果公共/私有是问题,它将无法编译。正如 Fiktik 所说,您发布的 cdoe 不应该编译。当发布的代码只是大致正在使用的代码时,很难解决问题。所以,我什么都不确定。
  • @DanishAltafSatti 我放弃了,没有看到真实代码(而不是代码描述,以及真实代码的近似值)恐怕很难提供帮助。如果您想解决此问题,我建议您发布真实完整的代码。如有必要,请在发布之前减小程序的大小。将其缩减为仍然存在错误的最小完整程序,然后他们发布整个程序。这样,您将很快将其修复。目前你只是在浪费时间。

标签: c++ class pointers constants


【解决方案1】:

我是否正确假设 const ClassN-1* ptrClassN-1 成员是指向当前实例的“所有者”的指针,并且该实例他们指向ClassN-2中的向量中的生命?

在这种情况下,您只是忘记了向量具有在内存中移动其内容的习惯,因为它们重新分配以容纳新插入的值。不要将指向对象的指针存储在向量中,而是将对象存储在列表中(并获取指向列表中实例的指针,因为它仍然被复制)或存储指针向量(并确保删除析构函数中的元素)。

【讨论】:

  • +1,这是一个合理的建议。
  • @Jan 是的,您的假设是正确的。但还有一件事。对象仅在向量中存储一次,之后向量不会更新,仅检索指针。还会导致这个问题吗?
  • @Danish 取决于您如何填充向量。如果你只是在对象之后 push_back 对象......那么肯定是的。
  • @Fiktik 我正在使用推回。这是我第一次在 C++ 中做某事,它似乎比我最初想象的要复杂。在 Java 中你不必担心这些事情。
猜你喜欢
  • 2014-08-22
  • 2016-05-07
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2015-06-14
  • 2015-08-09
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多