我很想知道为什么以下内容会在g ++中引发错误(无法在没有对象的情况下调用成员函数)。我想一个解决方法是将B类变量作为A中的静态变量 - 但我很想知道为什么,当有一个A的子类C的实例创建时,这仍然会引发错误 - 非常感谢!
#include <iostream>
#include <cstring>
using namespace std;
class B {
public:
double var;
public:
friend class A;
B() : var(1) { };
void set(double new_rate);
};
class A {
protected:
B main_B;
public:
virtual void set_rate(double new_rate) { cout << "test";
//B.set(new_rate);
}
};
class C : public A {
};
/*
void B::set(double new_rate) {
var = new_rate;
cout << "worked " <<current_rate <<endl;
}
*/
int main() {
C test_C;
A::set_rate ( 2.00 );
return 0;
}
答案 0 :(得分:7)
首先,
C test_c();
不会创建C的实例,它会声明一个返回C的函数。你的意思是:
C test_c;
其次,非静态成员函数只能在类的特定实例上调用。因此,使用更正的代码,您可以说:
test_c.set_rate( 2.0);
答案 1 :(得分:1)
您可以使用显式<class>::
来调用非静态成员函数,从而禁用任何虚函数机制,但对于非静态成员,您仍需要指定要调用该函数的类实例
e.g。
int main()
{
C test_C;
test_C.A::set_rate(2.00);
return 0;
}