【问题标题】:C++ overloading a friend class function parameter with an argumentC ++用参数重载朋友类函数参数
【发布时间】:2016-06-03 21:44:26
【问题描述】:

我不确定术语重载是否适用于此,但我想做的是继承一个类,然后在没有任何参数的情况下调用它的成员函数,以便从当前类成员变量自动继承参数.用代码更容易解​​释,所以我把它贴在这里:

#include <iostream>

template <typename T>
struct Singleton {
    static T & Instance() {
        static T instance;
        return instance;
    }

    T * operator -> () const {
        return &Instance();
    }
};

struct SFoo : Singleton<SFoo> {
    void Print( int a = 0 ) {
        printf( "%d\n", a );
    }
};

struct SBar : SFoo {
    const static int b = 42;
    friend void Print( int a = b); // <- Should call SFoo::Print() with integer b as the argument
};

int main() {
    using Foo = Singleton<SFoo>;
    using Bar = Singleton<SBar>;

    Foo()->Print( 123 ); // Should print: 123
    Bar()->Print();      // Should print: 42

    getchar();
    return 0;
}

我对继承比较陌生,似乎无法弄清楚这么简单的一段代码。现在的结果是打印1230(默认参数SFoo::Print()),这是意料之外的。

【问题讨论】:

  • 你不能让例子更简单吗?例如单例和模板与您的问题有什么关系?
  • 你可以忽略它,它确实与问题无关,但我出于个人喜好在我的调试/测试代码中实现了它。与 Singleton 相关的所有内容都可以忽略,您仍然可以轻松理解我希望实现的总体思路,我很抱歉 :)

标签: c++ class inheritance default-arguments


【解决方案1】:
void Print(int a = b) { SFoo::Print(a); }

让它发挥作用,正如您所指出的,它也可以是:

void Print() { SFoo::Print(b); }

因为我们不需要接受int 的两个版本。

另一方面,您声明了一个friend(这是一个非成员函数)。它没有在程序中的任何地方调用(Bar()-&gt;Print(); 调用 SFoo::Print),并且由于缺少定义,您没有收到链接器错误。

【讨论】:

  • 谢谢,太好了。但是,如果我需要使用在运行时获取的成员变量怎么办。为参数设置默认参数不值得使用非静态成员引用。也许有任何(替代)解决方案?
  • @MartinK 看看here
  • 没关系,我很傻。我可以从函数中删除参数并直接使用成员变量调用SFoo::Print(b)。再次感谢您!
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多