使用重载的operator()访问类中的静态数组

时间:2011-10-19 17:44:26

标签: c++

我是新来的,所以我希望我会写出可以理解的问题。

我的问题是,如何使用重载的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;
}

感谢您的回复,希望我的问题有道理。我没有使用[]运算符进行访问,因为它比()更难实现。

6 个答案:

答案 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)

如果你很狡猾,可以做到,但这很难看。添加一个变量来保存最后一个结果,一个构造函数根据xy参数设置该变量,一个运算符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 }};

http://ideone.com/gQJz5

答案 5 :(得分:0)

您的const int& SomeClass::operator() (int x, int y) const不是静态运算符...... C ++标准也不允许将其声明为static。因此,它必须与SomeClass的实例相关联才能被调用。