【问题标题】:Default return of class instance without member function没有成员函数的类实例的默认返回
【发布时间】:2018-04-12 16:16:00
【问题描述】:

当对象在某处使用时(不使用getter成员函数),是否可以让类默认返回特定的成员变量?

如果我有这门课:

class A{
    public: 
       A(int nr) : number(nr){};
       ~A();
       int getNr(){ return this->number };
       int number;
};

稍后在程序中设置和获取它的编号,我可以这样做:

int main(){
    A thing(23);
    std::cout<<"Your number is: "<<thing.getNr();
    return 0;
}

但我想做的是:

std::cout<<"Your number is: "<<thing;

并得到完全相同的结果,使其默认返回成员变量“number”。这可以以某种方式完成/设置吗?

我知道有人可能会想“为什么不直接使用整数呢?” - 我正在创建一个应该能够“变成的类>" 任何类型,然后像分配的类型一样,如果我能在这方面让它像整数、双精度和字符串一样,那就太好了。

【问题讨论】:

标签: c++ class return default


【解决方案1】:

您的具体示例在A 上调用&lt;&lt; stream insertion operator。这个运营商can be overloaded做你想做的事:

#include <iostream>

class A{
    public: 
        A(int nr) : number(nr) { }
        ~A() { }
        int getNr() const { return this->number; }
        int number;
};

std::ostream& operator<<(std::ostream& os, const A& a) {
    os << a.getNr();
    return os;
}

int main(int, char *[]) {
    A a(42);
    std::cout << a << std::endl; // prints 42
}

请注意,我已对您的代码进行了其他一些小修复(修复了缺失的; 并删除了一些不必要的;将const 添加到getNr())。

对于其他情况,例如将A 类型的参数传递给接受不同类型参数的函数,您可以定义user-defined conversion operators,由编译器调用以将A 转换为不同类型。例如:

void doSomething(int x) {
    // ...
}

class A{
    public: 
        A(int nr) : number(nr){}
        ~A(){}
        int getNr(){ return this->number; }
        int number;
        operator int() { return getNr(); }
};

int main(int, char *[]) {
    A a(42);
    doSomething(a); // calls operator int() above
    return 0;
}

小心使用用户定义的转换运算符。特别是,通常最好将它们标记为explicit 并使用static_cast&lt;T&gt;() 来触发转换。隐式转换会很快让您在重载解析方面遇到麻烦。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2015-01-15
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多