【问题标题】:how to call member methods inside a wrapper class without repeating the method definition inside the wrapper class?如何在包装类内部调用成员方法而不重复包装类内部的方法定义?
【发布时间】:2017-09-06 12:31:22
【问题描述】:

假设我有一个嵌入单个成员的包装类:

class wrapper {
    public:
    Object obj;
     // the rest ...
   };

如果成员变量obj有一些方法,我怎么能调用成员变量的方法而不像这样在包装类中显式定义方法?

class wrapper{ 

public:


    void foo { obj.foo ();    }
    int bar (int x) {return obj.bar(x);    }


};

我知道这在 python 中是可行的,但我如何在 c++ 中拥有相同的功能?

ps- 请注意我不想从成员类继承。根据定义,这不会是包装类。我想通过组合来实现这一点。

【问题讨论】:

  • 也许wrapper 类继承自Object
  • 我应该添加我想通过组合而不是继承来做到这一点。可行吗?

标签: class visual-c++ wrapper


【解决方案1】:

有几种方法可以处理这个问题。一种是创建一个 getter 来返回 wrapper 对象,另一种是覆盖类型转换运算符:

class Object {
public:
    void foo() {cout << "test" << endl;}
};

class wrapper {
protected:
    Object obj;
public:
    operator Object&() {return obj;}
    Object& getObject() {return obj;}
};

void f(A& a) {
    a.foo();
}

int main() {
    wrapper w;
    ((Object)w).foo();
    w.getObject().foo();
    f(w);
    return 0;
}

如您所见,类型转换运算符要求您转换 wrapper 对象,除非作为参数传递给函数 f()

另外,在您的示例中,您已经将obj 成员作为public,因此它被公开了。你可以:

wrapper w;
w.obj.foo();

这里有一个讨论:What good are public variables then?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2018-11-28
    • 2012-09-18
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多