我是新来的,所以我希望我会写出可以理解的问题。
我的问题是,如何使用重载的operator()来访问类中的静态数组。
Main.cpp的:
class SomeClass
{
public:
static const int a[2][2];
const int& operator() (int x, int y) const;
};
在它下面,我定义了数组a:
const int SomeClass::a[2][2] = {{ 1, 2 }, { 3, 4 }};
这是重载的运算符:
const int& SomeClass::operator() (int x, int y) const
{
return a[x][y];
}
在main()中,我想通过使用shloudl返回4的SomeClass(1, 1)
来访问'a'二维数组。但是当我尝试像这样编译main时:
int main(void)
{
cout << SomeClass(1, 1) << endl;
return 0;
}
我收到此错误:
PretizeniOperatoru.cpp: In function ‘int main()’:
PretizeniOperatoru.cpp:22:22: error: no matching function for call to ‘Tabulka::Tabulka(int, int)’
PretizeniOperatoru.cpp:22:22: note: candidates are:
PretizeniOperatoru.cpp:5:7: note: SomeClass::SomeClass()
PretizeniOperatoru.cpp:5:7: note: candidate expects 0 arguments, 2 provided
PretizeniOperatoru.cpp:5:7: note: SomeClass::SomeClass(const SomeClass&)
PretizeniOperatoru.cpp:5:7: note: candidate expects 1 argument, 2 provided
我意识到我不知道,问题出在哪里。似乎有一个类的构造函数。似乎我正在构建类而不是访问数组。
这是什么意思?有没有办法像这样做这个数组,或者打破封装规则并将其定义为全局更好?这是否意味着,重载的运算符不能用于访问静态数组?
当我这样做时,它编译好了:
int main(void)
{
SomeClass class;
cout << class(1, 1) << endl;
return 0;
}
感谢您的回复,希望我的问题有道理。我没有使用[]运算符进行访问,因为它比()更难实现。
答案 0 :(得分:3)
您无法制作静态operator()
。语法SomeClass(1, 1)
试图调用SomeClass
的不存在的构造函数,它带有两个整数。您必须有一个对象实例,可以在其上调用operator()
,就像您在第二个示例中所做的那样(class
是关键字除外)。
答案 1 :(得分:1)
您需要实例化类的对象才能访问其成员。尝试使用
cout << SomeClass()(1, 1) << endl;
相反,实例化一个临时的并使用它的operator()。
答案 2 :(得分:1)
您不能重载运算符并使其静态。
话虽如此,您可以重载您的运算符并从SomeClass
类型的对象访问该成员:
SomeClass s;
s(1,2);
答案 3 :(得分:1)
cout << SomeClass(1, 1) << endl;
此行创建一个SomeClass
类型的临时对象,并将该对象传递给operator<<
。
您要创建一个临时对象,调用operator()
,然后将结果传递给operator<<
:
cout << SomeClass()(1,1) << "\n";
P.S。如果您的意思是endl
,请勿使用'\n'
。
答案 4 :(得分:1)
如果你很狡猾,可以做到,但这很难看。添加一个变量来保存最后一个结果,一个构造函数根据x
和y
参数设置该变量,一个运算符int()来执行转换。您可能希望重载运算符&lt;&lt;同样。
class SomeClass
{
public:
static const int a[2][2];
mutable int result;
SomeClass() {}
SomeClass(const SomeClass& r) :result(r.result) {}
SomeClass(int x, int y) :result(a[x][y]) {}
int operator() (int x, int y) const {return result=a[x][y];}
operator int() const {return result;}
friend ostream& operator<<(ostream& o, const SomeClass& r) {return o<<r.result;}
};
const int SomeClass::a[2][2] = {{ 1, 2 }, { 3, 4 }};
答案 5 :(得分:0)
您的const int& SomeClass::operator() (int x, int y) const
不是静态运算符...... C ++标准也不允许将其声明为static
。因此,它必须与SomeClass
的实例相关联才能被调用。