【问题标题】:operator [] overloading on vector class向量类上的运算符 [] 重载
【发布时间】:2018-03-25 19:59:09
【问题描述】:

我正在尝试重载 [] 运算符,以便当程序员希望检索和设置包含在向量中的字符串的特定字符时,传递给 [] 的数字将引用来自的第 i 个字符向量的开头,到结尾。

例如: 这是一个向量。从头(0)开始,内容如下:

dog
cat
parrot

其中 'dog' 是向量中的第一个字符串,而 'parrot' 是最后一个。我希望 [] 运算符的功能如下:

searchable_vector vec;
vec.push_back("dog");
vec.push_back("cat");
vec.push_back("parrot");

std::cout << vec[3] << " should say 'c' ";

这是我的 searchable_vector.hpp:

#pragma once
#include <vector>
class searchable_vector : public std::vector<std::string>
{
 public:
    char& operator [] (int n);
 private:
    std::vector<std::string> vector;
};

这里是 searchable_vector.cpp:

char& searchable_vector::operator[] (int i)
{
    // 'for each' string in vector member, count 
    // the length and add it to a counter until
    // the counter is at desired 'length' (given from i)
    unsigned int counter = 0;
    unsigned int spot_in_string = 0;
    std::string holding_string = "";

    std::vector<std::string>::iterator it;
    it = vector.begin();

    while (it != vector.end() && counter != i)
      {
          if (counter == i) // it is where it needs to be
              break;
          else 
          {
              spot_in_string = it->length() - 1;
              if (counter != 0)
                  counter += spot_in_string + 1;
              else
                  counter += spot_in_string;

              if (counter < i) // look in next string
              {
                it++;
              }
              else if (counter > i)
              {
                while (counter != i)        // go 'back' one at a time
                {
                  counter--;
                  spot_in_string--;
                }
                break; //should break out of master while loop
              }
          }
      }
      holding_string = *it;
      return holding_string[spot_in_string];
}

我不会太担心这段代码内部发生的逻辑,但我认为我在重载方面做得不对,因为我在测试中遇到了 Linker 2019 错误(使用 Visual Studio)单元测试文件:

TEST_CASE("Test searchable_vector class [] operator", "[searchable_vector]")
{
    searchable_vector vec;
    vec.push_back("dog");
    vec.push_back("cat");
    vec.push_back("parrot");
    char result = vec[3];
    REQUIRE(result == 'c');
}

错误显示:

LNK2019 unresolved external symbol "public: char & __cdecl 
searchable_vector::operator[](int)" (??Asearchable_vector@@QEAAAEADH@Z) 
referenced in function "void __cdecl ____C_A_T_C_H____T_E_S_T____2(void)" (?
____C_A_T_C_H____T_E_S_T____2@@YAXXZ)   unit_tests

后面是包含我的 VM_Module.obj 的目录

我认为这只是我的过载的基本问题,而不是逻辑本身。如果它被破坏了,它仍然应该链接并运行,只是表现不佳或崩溃。

我们将不胜感激任何建设性的反馈。

另外,我想重载 this 的原因是,我要编写的代码期望 searchable_vector 对象的行为如前所述,返回向量中的第 i 个字符,如果成功实现,应该是干净和简单的来写。谢谢。

【问题讨论】:

  • 我相信这与我从操作员返回 char& 的方式有关。注释掉“char result = vec[3];”时和测试的 REQUIRE 行,一切都会编译。我只是想我需要返回字符的地址,以便我还可以设置向量的字符,例如“vec[44] = 't';
  • 可能不相关,但错误:除了链接器问题之外,您还返回了对本地的引用。您返回一个char&amp;,它指向本地变量std::string holding_string 的一个字符。建议:警告级别 4,警告为错误。
  • @user2328447 非常好!我只是不知道我还能如何使用运算符来设置向量中的字符(如 vec[6] = 'g'; )。也许这意味着我需要重载 operator= for....向量类?
  • 很可能 searchable_vector.cpp 没有包含在您的程序中。确保它是 IDE 的“项目”的一部分。
  • 返回引用应该没问题,但不能返回本地 ;) 您可以完全删除 holding_string 并将最后两行替换为 return (*it)[spot_in_string]。这将返回对您的向量所持有的字符串中的字符的有效引用。无论如何,在返回引用时,您必须注意错误插入,因为在这种情况下,您将无法返回任何有效的东西。例如。如果索引超出范围。最好的方法可能是抛出一个std::out_of_range,但至少应该有一个断言。

标签: c++ inheritance vector cmake operator-overloading


【解决方案1】:

链接的问题是因为我没有将标题和源代码添加到我的 CMakelists.txt 中,以便 CMake“了解”我猜。更改后,我重新运行了 cmake,一切正常。

至于从向量继承的危险,是的,当我发现我的私有向量中没有任何内容时,我了解到这一点。这是因为当我打电话时

vec.push_back("somestring");

在我的测试中,push_back()(从 vector 继承)将值存储到 INHERITED 'collection',如果你愿意的话,而不是我的私人的。所以我只是删除了我的私人向量,因为它是不必要的,并稍微改变了我的 cpp,所以它被设置为

it = this->begin();

而不是

it = vector.begin();

所以它现在可以工作了:)

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 2013-11-10
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多