【发布时间】: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&,它指向本地变量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