C++ 如何更改指针访问运算符的含义

C++ 如何更改指针访问运算符的含义,c++,function,operator-overloading,operators,multiple-definition-error,C++,Function,Operator Overloading,Operators,Multiple Definition Error,这可能是一个很明显的问题,请原谅 下面是我项目的代码片段 #include <stdio.h> class X { public: int i; X() : i(0) {}; }; int main(int argc,char *arv[]) { X *ptr = new X[10]; unsigned index = 5; cout<<ptr[index].i<<endl; return 0; } #包括 X类 { 公众:

这可能是一个很明显的问题,请原谅

下面是我项目的代码片段

#include <stdio.h>
class X
{
  public:
   int i;
   X() : i(0) {};
};

int main(int argc,char *arv[])
{
  X *ptr = new X[10];
  unsigned index = 5;
  cout<<ptr[index].i<<endl;
  return 0;
}
#包括
X类
{
公众:
int i;
X():i(0){};
};
int main(int argc,char*arv[]
{
X*ptr=新X[10];
无符号索引=5;

cout是的,如果所有参数都是内置类型(包括原始指针),则无法定义自定义运算符

而且,像这样以不明显的方式定义运算符几乎总是不好的


你可能想考虑用一个类似于一个类的类来交换一个原始指针到“代码> x/CODE”。这可能比较容易,取决于你的代码(例如,如果你有很多模板)。

是的,不可能定义所有的参数都是内置类型的自定义运算符(包括原始指针)。 而且,像这样以不明显的方式定义运算符几乎总是不好的


你可能想考虑用一个类似于一个类的类来交换一个原始指针到<代码> x/COD>。这可能比较容易,取决于你的代码(例如,如果你有很多模板)。

正如亚历克斯所说,你的“子索引”用法<<代码> []/Cord>对于任何阅读你的代码的人来说都是完全不明显的。 也就是说,您可以定义这样的类:

template<class T>
class SubindexingList {
    vector<T> data;
    vector<int> subindexes;
public:
    SubindexingList(int count) : data(count) { }
    void set_subindexes(vector<T> const& newval) { subindexes = newval; }
    T& operator[](int index) { return data[subindexes[index]]; }
    T const& operator[](int index) const { return data[subindexes[index]]; }
};
模板
类子索引列表{
矢量数据;
向量子索引;
公众:
子索引列表(整数计数):数据(计数){
void set_子索引(vector const&newval){subindex=newval;}
T&运算符[](int-index){返回数据[子索引[索引]];}
T const&运算符[](int-index)const{return data[subindex[index]];}
};

并将你的
X*ptr=new X[10];
替换为
SubindexingList stuff(10);

正如Alex所说,你对
[]
的“子索引”用法对于任何阅读你的代码的人来说都是不明显的

也就是说,您可以定义这样的类:

template<class T>
class SubindexingList {
    vector<T> data;
    vector<int> subindexes;
public:
    SubindexingList(int count) : data(count) { }
    void set_subindexes(vector<T> const& newval) { subindexes = newval; }
    T& operator[](int index) { return data[subindexes[index]]; }
    T const& operator[](int index) const { return data[subindexes[index]]; }
};
模板
类子索引列表{
矢量数据;
向量子索引;
公众:
子索引列表(整数计数):数据(计数){
void set_子索引(vector const&newval){subindex=newval;}
T&运算符[](int-index){返回数据[子索引[索引]];}
T const&运算符[](int-index)const{return data[subindex[index]];}
};

并将您的
X*ptr=new X[10];
替换为
子索引列表内容(10);

这个解决方案比我强-唯一的问题是将子索引传递给构造函数并从中确定大小会很好。如果可能的话。在正确的上下文中使用,这可能不像听起来那么奇怪…是的,当然,但细节对这个答案来说并不重要谢谢!购买尽可能最好的解决方案。尽管我喜欢pre您提供的帖子(在构造函数中传递子索引的地方…,这将强制用户执行某些操作).你比我先找到了这个解决方案-唯一的问题是将子索引传递给构造函数并从中确定大小会很好。如果可能的话。在正确的上下文中使用,这可能不像听起来那么奇怪…是的,当然,但细节对这个答案来说并不重要谢谢!购买尽可能最好的解决方案。尽管我喜欢上一篇文章w你提供的(在构造函数中传递子索引的地方…,这将强制用户执行某些操作)。Leeeek delete[]ptr?:),是的,很抱歉忘记添加,因为我急于发布问题。:)再次。Leeeek delete[]ptr?:),是的,很抱歉忘了添加,因为我急于发布问题。:)再次。谢谢!亚历克斯,很好的建议。谢谢!亚历克斯,很好的建议。