在复制构造函数C ++中使用print()函数

时间:2016-02-11 14:36:14

标签: c++ reference copy

任务是创建类,它在每个时刻计算其类型的对象。这是我的代码。错误是: 1.对象具有与成员函数不兼容的类型限定符" counter :: print&#34 ;; 2.返回值类型与函数类型不匹配; - 这真的很棒! 我纠正了错误,它给了我一个我无法修复的错误; 1.' void counter :: print(void)':无法转换'这个'指针来自' const计数器'到'反击&'

class counter {
private:
    static int count;
public:
    counter();
    counter(const counter &from);
    void print() const;
    ~counter();
};
counter::counter() {
    ++count;
}
counter::counter(const counter &from) {
    ++count;
    cout << "Copy constructor:\t";
    from.print(); // here is the error
}
void counter::print() const{
    cout << "\t Number of objects = " << count << endl;
}
counter::~counter() {
    --count;
    cout << "Destructor:\t\t";
    print();
}
int counter::count = 0;
counter f(counter x);
void main() {
    counter c;
    cout << "After constructing of c:";
    c.print();
    cout << "Calling f()" << endl;
    f(c);
    cout << "After calling f():";
    c.print();
}
counter f(counter x) {
    cout << "Argument inside f():\t";
    x.print();
    return x;
}

2 个答案:

答案 0 :(得分:1)

首先,改变:

void print();

为:

void print() const;

因为(a)无论如何它都是const方法,并且(b)您试图在构造函数中的const上下文中调用它。

对于第二个错误:

void f(counter x) {
    cout << "Argument inside f():\t";
    x.print();
    return x; // 2 - nd error
}

很明显,您无法从void函数返回值。将其更改为:

counter f(counter x) {
    cout << "Argument inside f():\t";
    x.print();
    return x;
}

或者根本不回复任何东西:

void f(counter x) {
    cout << "Argument inside f():\t";
    x.print();
}

答案 1 :(得分:0)

  

void print();

您已声明了非const成员函数,这意味着它不能被const实例调用。

  

from.print(); // 1 - st error

此处from的类型为const counter&,这意味着它无法调用print函数。而是使你的print函数为常量。

void print() const;
void counter::print() const { ... }
  

return x; // 2 - nd error

为什么要从具有void返回类型的函数返回任何内容?