C++ 将类与运算符[]一起使用

C++ 将类与运算符[]一起使用,c++,class,operator-overloading,C++,Class,Operator Overloading,我正在尝试实现一个Integer类,希望它能像内置类型int一样工作。但我遇到了一个问题:我不能在运算符[]中像int一样使用这个类。请参阅下面的代码: #include <iostream> using namespace std; class Integer { private: int Value; public: Integer(int x = 0) { Value = x;

我正在尝试实现一个Integer类,希望它能像内置类型int一样工作。但我遇到了一个问题:我不能在运算符[]中像int一样使用这个类。请参阅下面的代码:

#include <iostream>
using namespace std;

class Integer
{
    private:
        int Value;

    public:
        Integer(int x = 0)
        {
            Value = x;
        }

        void SetValue(int x)
        {
            Value = x;
        }

        int GetValue()
        {
            return Value;
        }

        Integer& operator [] (Integer X);
};

Integer& Integer::operator [] (Integer X)
{
    // Code
}

int main()
{
    Integer X[10];
    Integer I(5);
    int i = 5;

    for(int i=0; i<10; ++i)
        X[i].SetValue(i+1);

    cout << X[i].GetValue() << endl;    // It still work
    cout << X[I].GetValue() << endl;    // Doesn't work

    return 0;
}

排除强制转换运算符有什么方法可以让运算符[]像对待int一样理解我的整数类型?

您的想法是错误的。您不需要在自己的类上重载[]运算符,实际上您需要将类转换为int,这可以通过重载cast运算符来实现

class Integer
{
public:
  operator int () const { return Value; }
};

你的想法是错误的。您不需要在自己的类上重载[]运算符,实际上您需要将类转换为int,这可以通过重载cast运算符来实现

class Integer
{
public:
  operator int () const { return Value; }
};

这里有点混乱。类型为T的数组的声明采用以下形式

T t[n];
其中n是数组大小的编译时可计算常量表达式

这不会调用在T中定义的任何[]运算符,也不会通过表达式T[i]对整型i进行元素的后续访问

在您的例子中,如果希望X[I]是可编译的,那么您需要提供一个运算符,允许将I更正式地视为数组索引。该语言需要一个基元整型。将强制转换运算符转换为int是一个明显的选择,具有

operator int() const
{
    return Value;
}

作为实现。

这里有点混乱。类型为T的数组的声明采用以下形式

T t[n];
其中n是数组大小的编译时可计算常量表达式

这不会调用在T中定义的任何[]运算符,也不会通过表达式T[i]对整型i进行元素的后续访问

在您的例子中,如果希望X[I]是可编译的,那么您需要提供一个运算符,允许将I更正式地视为数组索引。该语言需要一个基元整型。将强制转换运算符转换为int是一个明显的选择,具有

operator int() const
{
    return Value;
}

作为实现。

您需要向类中添加类型转换操作符。这允许将类转换为兼容类型。有关更多信息,请参见此处:

这个函数应该为您的类完成这个任务

operator int() const { return GetValue(); }

您需要向类中添加类型转换运算符。这允许将类转换为兼容类型。有关更多信息,请参见此处:

这个函数应该为您的类完成这个任务

operator int() const { return GetValue(); }

实际上,您不需要重载[]操作符。 您只需要确保可以使用int-int运算符将整数转换为int

像这样的东西会更好用

operator int() const
{ return GetValue(); }
那你也应该小心你的指纹

X[i].GetValue是错误的,因为在您的示例中i=10。这将导致执行错误


示例中的X[I].GetValue是错误的,因为没有I.GetValue,类和int之间的反转换是不可能的。我很惊讶这不会导致编译错误,但是重载int运算符会导致这个问题。

实际上,您不需要重载[]运算符。 您只需要确保可以使用int-int运算符将整数转换为int

像这样的东西会更好用

operator int() const
{ return GetValue(); }
那你也应该小心你的指纹

X[i].GetValue是错误的,因为在您的示例中i=10。这将导致执行错误


示例中的X[I].GetValue是错误的,因为没有I.GetValue,类和int之间的反转换是不可能的。我很惊讶这不会导致编译错误,但是重载int运算符会导致这个问题。

在您的示例中根本没有调用重载运算符。在您的示例中根本没有调用重载运算符。@TheBeardedQuack。你和我对这个问题有不同的看法。当有多个答案可供选择时,堆栈溢出效果最佳。解释错误仍然很好,给OP提供了学习的机会,但也许也添加了正确的方法?@TheBeardeQuack:第二次阅读时,我错过了问题的关键。谢谢@Bathsheba,但我正在寻找一种没有演员操作工的其他方式。@LongChampion:为什么?如果你想使用一个基元数组,这是不可能的,所以你不能写整数X[10]@他们胡子嘎嘎作响。你和我对这个问题有不同的看法。当有多个答案可供选择时,堆栈溢出效果最佳。解释错误仍然很好,给OP提供了学习的机会,但也许也添加了正确的方法?@TheBeardeQuack:第二次阅读时,我错过了问题的关键。谢谢@Bathsheba,但我正在寻找一种没有演员操作工的其他方式。@LongChampion:为什么?如果你想使用一个基元数组,这是不可能的,所以你不能写整数X[10];谢谢@TheBeardedQuack,成功了!。但我是从我的朋友那里知道的。因此,我正在寻找另一种方法
out cast expresion来完成它。这是唯一一种不用显式调用函数就可以完成的方法。数组访问运算符需要一个int类型,因此您必须转换兼容的类型或仅提供一个int。例如,您可以执行X[I.GetValue],但您的问题暗示您希望在运算符tanks@TheBeardedQuack中直接使用该类型,它起作用了!。但我是从我的朋友那里知道的。因此,我正在寻找另一种不使用cast-expresion的方法,这是唯一一种不需要显式调用函数的方法。数组访问运算符需要int类型,因此您必须转换兼容的类型,或者只提供int。例如,您可以执行X[I.GetValue],但您的问题暗示您希望在运算符中直接使用该类型。首先,我不认为X[I].GetValue是错误的。我必须将主函数的“I”与for循环I区分开来——它仅在这个for循环中可用。其次,X[I].GetValue实际导致编译错误:。您可以编译并运行我的代码来检查它。无论如何,如果您实现int运算符,它应该可以编译而没有任何问题。首先,我不认为X[i].GetValue是错误的。我必须将主函数的“I”与for循环I区分开来——它仅在这个for循环中可用。其次,X[I].GetValue实际导致编译错误:。你可以编译并运行我的代码来检查它。无论如何,如果你实现了int运算符,它应该可以编译而没有任何问题。