C++ 向量类上的运算符[]重载

C++ 向量类上的运算符[]重载,c++,inheritance,vector,cmake,operator-overloading,C++,Inheritance,Vector,Cmake,Operator Overloading,我试图重载[]运算符,以便当程序员希望检索和设置包含在向量点中的字符串的特定字符时,传入[]的数字将引用向量开头到结尾的第I个字符 例如: 这是一个向量。从开头(0)开始,内容如下: dog cat parrot searchable_vector vec; vec.push_back("dog"); vec.push_back("cat"); vec.push_back("parrot"); std::cout << vec[3] << " should say '

我试图重载[]运算符,以便当程序员希望检索和设置包含在向量点中的字符串的特定字符时,传入[]的数字将引用向量开头到结尾的第I个字符

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

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

std::cout << vec[3] << " should say 'c' ";
其中“dog”是向量中的第一个字符串,“parrot”是最后一个字符串。我希望[]运算符的功能如下所示:

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

std::cout << vec[3] << " should say '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的目录

我认为这只是我的超负荷的一些基本问题,而不是逻辑本身。如果这被打破了,它应该仍然链接并运行,只是表现不好或崩溃

如有任何建设性反馈,将不胜感激


另外,我想重载它的原因是,我将要编写的代码期望可搜索的_向量对象的行为与前面提到的一样,返回向量中的第I个字符,如果成功实现,应该是干净且易于编写的。谢谢。

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

至于从vector继承的危险,是的,当我发现我的私人vector中没有任何东西时,我了解到了这一点。这是因为我打电话的时候

vec.push_back("somestring");
在我的测试中,push_back()(继承自vector)将值存储到继承的“集合”(如果愿意),而不是我的私有集合。所以我只是删除了我的私有向量,因为它是不必要的,并且稍微更改了我的cpp,所以它被设置为

it = this->begin();
而不是

it = vector.begin();

所以它现在正在工作:)

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