开发者社区> 问答> 正文

C++ 不能在已经用作变量的对象中使用成员

我有两个类,其中第一个在一个对象中实例化,该对象在类“ two”的另一个对象内使用。我遇到的问题是尝试通过第二类的对象访问第一类的对象的成员时。

我在arduino上使用这种方法来实例化一个对象,该对象将控制带有LiquidCrystal_I2C类的LCD,该对象将在实例化后立即需要参数。

示例代码:

#include <iostream>

    using namespace std;

    class A
    {
    public:
      int data;
      int state;
        A (int); // Constructor needs parameter
      void setState (int);
      int getState ();
    };

    A::A (int newdata)
    {
      data = newdata;
    }

    void A::setState (int newstate)
    {
      state = newstate;
    }

    int A::getState ()
    {
      return state;
    }

    class B
    {
    public:
      A * a;
      int aState;
        B ();
      void attachA (int);
      void printall ();
    };

    B::B ()
    {
    }

    void B::attachA (int data)
    {
      A newobj (data);
      a = &newobj;
      a->setState (data + 1);
      aState = a->getState ();
      cout << "B obj. address?: " << this <<
        ", 'A' class obj. creation with data: " << data << " B.a->getState(): " <<
        a->getState () << ", B.a->data: " << a->data << "\n";
    }

    void B::printall ()
    {
      cout << "B obj. address?: " << this << ", 'A' member class address?: " << a
        << ", B.aState: " << aState << ", B.a->getState(): " << a->
        getState () << ", B.a->data: " << a->data << "\n";
    }

    int main ()
    {
      B temp_one;
      temp_one.attachA (123);

      B temp_two;
      temp_two.attachA (345);

      temp_one.printall ();
      temp_two.printall ();

      temp_one.printall ();

      temp_one.a->setState (42);
      temp_one.printall ();

      return 0;
    }

输出:

B obj. address?: 0x7ffe088aa130, 'A' class obj. creation with data: 123 B.a->getState(): 124, B.a->data: 123                                                                       
B obj. address?: 0x7ffe088aa140, 'A' class obj. creation with data: 345 B.a->getState(): 346, B.a->data: 345                                                                       
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144                                                  
B obj. address?: 0x7ffe088aa140, 'A' member class address?: 0x7ffe088aa108, B.aState: 346, B.a->getState(): 0, B.a->data: 4196144                                                  
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144                                                  
B obj. address?: 0x7ffe088aa130, 'A' member class address?: 0x7ffe088aa108, B.aState: 124, B.a->getState(): 0, B.a->data: 4196144 

问题来源:stackoverflow

展开
收起
禹果 2020-03-20 23:37:35 721 0
1 条回答
写回答
取消 提交回答
  • 我没有全部检查过,但是我之前遇到过此错误。

    attachA 中,创建一个临时对象并保存其地址。这样做是不行的,因为对象会在方法结束时被破坏。

    因此,您有一个地址到达堆栈中的某个位置(因为堆栈局部变量)。 在另一个对象上调用该方法时,堆栈框架偶然(或多或少)是相同的,并且该对象位于同一位置。

    因此,两个地址的末尾相同(并且附带无效)。

    回答来源:stackoverflow

    2020-03-20 23:40:03
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载