问题标签 [subscript-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
81 浏览

visual-c++ - 避免下标运算符中的临时变量

我有一个 v 类,它动态分配一个双精度数组。Entries 是指向此数组开头的指针。间距允许我跳过条目,例如,如果我只想考虑每三个条目,间距将为 3。

此下标运算符编译但会导致堆损坏。根据我的网络搜索,我认为 Visual Studio 将“条目 [n*spacing]”的结果存储在临时文件中,然后返回对临时文件的引用。当我尝试将此引用写入已释放内存时,会发生堆损坏。

有没有人有解决方法的想法?

0 投票
1 回答
2522 浏览

python - 在python中使用2个参数下标

假设我有一个类 X,它有 2 个属性:i 和 j。

我希望有 :

我现在希望下标以下列方式工作:

目前我正在尝试这个:

然而,这一直给我错误getitem 只接受 3 个参数,但给出了 2 个(例如,当我尝试打印出 x[1,2] 时)

0 投票
4 回答
2391 浏览

c++ - 具有 std::map 成员变量的类的下标运算符

我正在尝试创建一个包装 std::map 并进行检查以确保键是已批准的有效字符串之一的类,并将映射初始化为具有所有已批准的有效字符串的默认值。我在让下标运算符工作时遇到问题,特别是它的 const 版本。

这是我的类原型代码:

当我编译它时(使用带有 -std=c++0x 的 g++),我得到这个编译错误:

我所做的似乎都无法解决这个问题。我努力了

  • 使 validkeys 成为 std::set 和数据 std::map
  • 使用 const char * 代替字符串
  • 返回 const double 或 double 而不是 const double &
  • 使用列表和向量而不是设置来存储有效键

我不知道我是否正确地解决了这个问题,所以如果有其他简单的方法来创建一个允许这种功能的类:

任何建议都非常感谢。

解决方案

以下内容完全符合我的要求,当您尝试设置或获取不在有效密钥集中的密钥时,我什至有一个基本异常:

0 投票
3 回答
826 浏览

c++ - 设计:常量和非常量访问器相互依赖?

可能的重复:
如何删除相似的 const 和非常量成员函数之间的代码重复?

在以下示例中:

const 和 non-constoperator[]是独立实现的。

就设计而言,最好有:

  • 1)像这里的两个独立实现
  • 2) 两个函数之一调用另一个函数

如果解决方案 2) 更好,给定示例的代码是什么?

0 投票
1 回答
1139 浏览

c++ - 无效使用非静态数据成员(数组)

我对 C++ 很陌生,所以这可能是一个非常愚蠢的问题,但我很难找到解决方案。我四处寻找答案,TA似乎有逻辑上等效但神秘地工作的代码,我们不知道为什么。

我试图在我的头文件中声明一个数组(名为'array),我不断收到一些奇怪的错误。当我将其公开声明为“int* array;”时 或“int array[];”,构造函数告诉我这是对非静态数据成员的无效使用。当我将它声明为私有时,它抱怨数组的元素是私有的。

该赋值处理运算符重载,并处理具有奇数索引的数组,例如从 -3 到 5。下面是一些与问题相关的代码:

a[i] = i * 10; 是编译器抱怨的地方。

提前感谢您的帮助。

0 投票
1 回答
1254 浏览

c++ - 下标运算符重载:返回引用问题

我第一次重载下标运算符,并且在返回参考值时遇到了麻烦。我从c++faq tag
的帖子中遵循了经验法则,但是我缺少一些东西。

我在两种变体中都实现了它们:带有const返回值和const函数(如上)和不带(除了两个const关键字之外是相同的)。
问题是当我运行测试主程序时,它只是崩溃了。我认为错误在return *b->data;声明中,但我无法确定它可能是哪个,也无法确定我是否错了并且还有其他错误。
有任何想法吗?
提前致谢。

0 投票
1 回答
120 浏览

c++ - 重载 [] 但其结果在与其他运算符交互之前未解析(c++)

我有一个数据对象,我试图让所有操作员都使用它。它是一大块数据,其中包含变量 ptrs,并且有任意数量的不同类型和大小等等。类型由枚举和模板以及 switch 语句处理。所以对于每个 x,d[x] 是一种类型,可以是任意数量的类型,并且它们可以是向量。所以 d[x][y] 和 d[x][y][z]。我制作了一个内部帮助对象来帮助解决这个问题。所以我有 [] 重载来做这样的事情,它会返回正确的类型:(gcc 4.6.1)

[编辑:我对 d(x,y,z) 有同样的问题——问题不在于 [] 运算符]

我在这个辅助对象中重载了 T() 。

所以我只返回这个对象,它在那个时候解析它的类型(切换与 t->get< char>(d, x, i, j) 等相关的案例)。所以问题是,如果我想做这样的事情

然后我最终不得不重载每个运算符来接收这个临时数组辅助对象。现在我不得不在其中为一些操作员设置一个临时值,这很痛苦。

基本上,我觉得在编译器尝试获取其中两个并添加它们之前,我需要先解析运算符 T() 。

无论如何,我必须为 = 和 += 等运算符执行此操作,但我想删除这些帮助我定义所有其他运算符的 jazillion 宏。

另外,我觉得如果我能以某种方式重载左值运算符,我就不用担心 = 运算符了。也许那个和 &() (现在只返回一个模板化的 ptr)。...?或者实际上,这更像是我的意思,至少对于 d[] = something,但我还没有让它工作。我不确定如何将任何类型的 ptr 转换为此返回值。

我有大部分工作,但它有很多代码,我认为我将不得不为每个访问添加一个额外的 if 语句来执行临时工作,这是我不想做的。那么我错过了什么?

编辑:使用 d(x,i,j) 与 d[x][i][j] 相同。我很确定我至少在发布链接 nm 中使用的内容的开始部分。问题是在语句中使用最后一个辅助对象之前将其解析为它的数据。不知何故,编译器想要一个接受帮助对象的运算符,即使它知道如何在单独的时候解决它……我想。花了几天时间让每个操作员都超载,所以我忘记了所有细节。:)

但现在的主要问题是这样的东西:

我想定义以下内容,但它没有被使用——那么我认为我的问题可能会得到解决。一元操作 ~、- 和后缀 ++、-- 的类似故事。

但所有这一切只是因为我的 T() 有点不对劲,我想。其中大部分对我来说都是新的,所以我敢打赌我错过了一些东西。

0 投票
4 回答
803 浏览

c++ - C++ 双下标重载:无法从 'type' 转换为 'type &'

我正在尝试制作一个 2D 矩阵类,它实际上是向量的向量,并且两个类都是模板。我在向量类中重载了下标运算符。当我尝试使用错误消息在矩阵类中重载 operator[] 时会出现问题: error C2440: 'return' : cannot convert from 'vector' to 'vector &'。这是我的课程中的代码:

我进行了一些谷歌搜索,发现相同的示例或重载 () 而不是 []。我只是不明白为什么编译器看不到返回值Mat[index]作为参考(我认为它必须是参考)。当使用单个向量时,下标运算符工作得很好。请指出我的错误。提前致谢!

补充:使用非动态向量似乎可以解决当前的问题,但不是类型不匹配,而是我有两个链接器错误(未解析的外部符号)。通过注释和取消注释我的代码,我发现只有当行vector< vector<h> > Mat;Extend函数存在时才会出现问题(它是类向量中的空方法)。我想这与向量构造函数有关,但我不知道到底出了什么问题。

在 matrix.h 中(它还没有在单独的文件中):

如果可能的话,我很想听听任何建议。

0 投票
2 回答
2169 浏览

c++ - C++ 期望数组下标是什么类型?

在 C 语言中,数组订阅:a[b]仅仅是指针算术后解引用的语法糖等价物:(*(a+b)如解释,here)。

对于基本类型,如何在 C++ 中解释数组订阅?(不适用于我们有重载语义的类)?而且,更具体地说,C++ 期望以什么类型作为下标出现?是ptrdiff_t吗?

0 投票
1 回答
746 浏览

c++ - 模板类中运算符 [] 的可变模板化重载

我正在尝试重载运算符 []。以下代码无法编译,我怀疑我只是在犯语法错误,但我需要帮助理解我做错了什么以及为什么。

以下是相关代码的摘录:

注意1:我正在尝试遵循此答案顶部建议的可转换为类型检查的编译时间。