gpt4 book ai didi

c++ - 返回对模板类中私有(private)成员的引用

转载 作者:行者123 更新时间:2023-11-28 01:14:07 24 4
gpt4 key购买 nike

我有以下代码。

#include <iostream>
#include <vector>

template <typename T> class testTemp {
std::vector<T> container;
public:
std::vector<T&> getTest(int nrOfEle);
void push(T row){container.push_back(row);}
};

template<typename T>
std::vector<T&> testTemp<T>::getTest(int nrOfEle) {
std::vector<T&> refContainer;
for(int i =0; i < nrOfEle; i++){
refContainer.push_back(container[i]);
}
return refContainer;
}


int main() {
testTemp<std::vector<int> > test; // T =std::vector<std::int>
std::vector<int> fillMeUp;
for(int i=0; i < 10; i++){
fillMeUp.push_back(i);
}

test.push(fillMeUp);
std::vector<int> container = test.getTest(3); // when i change the elements in container
container[0] = 999; //this change should also affect the private `member inside the testTemp class`

return 0;
}

我想做的是从 main 调用函数 getTest() 以及我想要更改的元素数。在上面的代码中,我想更改前 3 个元素。所以我把它输入到函数中。然后该函数应将容器返回给 main,其中包含私有(private)成员 std::vector 容器的前 3 个元素作为引用,这样当我在 main 中进行更改时,它也会更改类容器 std::vector 容器中的元素。我不太确定如何实现这一目标。上面的代码是我的第一次尝试,但会导致错误

 "/usr/include/c++/9/ext/new_allocator.h:63:26: error: forming pointer
to reference type ‘std::vector<int>&’ 63 | typedef _Tp*
pointer;"

阅读 formerlyknownas_463035818 的评论后,我更改为

   template<typename T>
T* testTemp<T>::getTest(int nrOfEle) {

return &container[nrOfEle];
}

但是这似乎返回了 vector 对象的地址而不是元素

最佳答案

您不能有引用的 std::vector。有 std::reference_wrapper,但我建议采用不同的设计。我宁愿返回一个 beginend (第三个元素)迭代器,而不是返回一个新的 vector 。这些迭代器可以直接来自私有(private)成员。如果您担心调用者修改超出第三个元素的元素,您可以为迭代器编写一个包装器,它只提供对前三个元素的访问。

类似的东西:

template <typename T> class testTemp {
std::vector<T> container;
public:
std::vector<T>::iterator getTest_begin() { return container.begin(); }
std::vector<T>::iterator getTetst_end(int nrOfEle) { return container.begin() + nrOfEle; }
void push(T row){container.push_back(row);}
};

当然,您应该确保容器确实包含足够的元素。

关于c++ - 返回对模板类中私有(private)成员的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59264061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com