【问题标题】:Access Base class variable from child class method从子类方法访问基类变量
【发布时间】:2011-09-05 10:23:30
【问题描述】:

如何从子方法访问基类变量?我遇到了分段错误。

    class Base
    {
    public:
        Base();
        int a;
    };

    class Child : public Base
    {
    public:
        void foo();
    };

    Child::Child() :Base(){

    void Child::foo(){
        int b = a; //here throws segmentation fault
    }

在另一个班级:

    Child *child = new Child();
    child->foo();

【问题讨论】:

  • 这段代码不会编译。
  • 请修复你的代码,很明显, foo 方法是 Child::foo 的实现。
  • 投票结束这个问题有点苛刻,给 OP 修复代码的机会,似乎是一个有效的问题......
  • foo 被声明为私有方法。我想知道你是怎么称呼它的?
  • 好吧,你对这个编辑没有多大帮助。看起来仍然不是有效的代码。

标签: c++ inheritance segmentation-fault


【解决方案1】:
class Base
{
public:
    int a;
};

class Child : public Base
{
    int b;
    void foo(){
        b = a;
    }
};

我怀疑你的代码是否已经编译!

【讨论】:

  • 在最后一次编辑之后,所有讨论都毫无意义。删除我的 cmets。
【解决方案2】:

将类变量公开不是一个好习惯。如果你想从Child 访问a,你应该有这样的东西:

class Base {
public:
  Base(): a(0) {}
  virtual ~Base() {}

protected:
  int a;
};

class Child: public Base {
public:
  Child(): Base(), b(0) {}
  void foo();

private:
  int b;
};

void Child::foo() {
  b = Base::a; // Access variable 'a' from parent
}

我也不会直接访问a。如果你为a 做一个publicprotected getter 方法会更好。

【讨论】:

  • 取决于类是描述对象还是数据结构,以及在后一种情况下您是否要遵循 java bean 约定。
  • 如果它是一个对象,getter 可能是设计问题的标志。如果它是一种数据结构,getter 和 setter 可以使数据绑定之类的事情成为可能,并且它们可以遵循约定,例如 java 的 bean,从而实现更好的工具支持。但是,在 C++ 中建模为类的数据结构将选择权留给了开发人员,因为 getter 和 setter 不会产生任何直接的技术优势。
【解决方案3】:

解决了!问题是我从一个不存在的对象调用 Child::foo() (通过信号和插槽连接)。

感谢您的回答。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多