操作一个vector,并在另一个类中查看更改的结果



我有一个这样的类:

template<typename C, typename T = typename C::value_type>
class MyClass {
private:
std::vector<C>myOwnVectors;
public:
auto add(const C& addedContainer) {
myOwnVectors.push_back(addedContainer);
}
void displayMyContent() {
for (C j : myOwnVectors) {
for (T i : j) {
cout << i << endl;
}
}
}
};

我想要实现的是能够传递任何(单一)类型的STL容器到MyClass.add()。这些容器将被添加到MyClass中称为myOwnVectors的容器向量中。MyClass.displayMyContent()循环遍历vector,并依次显示所有添加容器的完整内容。

目前为止还可以。但是,如果我在main:

中这样做
MyClass<std::string, char> first;
std::string bi("Bing");
std::string bo("Bong");
first.add(bi);
first.add(bo);
bi[1] = 'o';
bo.push_back('g');
const MyClass<std::string, char> second = first;
first.displayMyContent();

首先我不能调用displayMyContent on second因为:

the object has type qualifiers that are not compatible with the member function "MyClass<C,T>::displayMyContent[with C=std::string,T=char]" object type is: const MyClass<std::string,char>"

然后,首先调用displayMyContent on并不能反映我对bi和bo所做的更改。它只打印最初添加的值。我希望它们能反映出变化。我知道我的代码可能需要进行重大修改,但我希望尽可能准确地描述我的意图。我已经尝试了几乎所有的指针/引用/值/const引用…等。我能想到的组合都无济于事。在这一点上,我怀疑是否有可能做这样的事情。

这里有一个使用指针的简单解决方案。正如其他人所建议的,你的成员vector必须存储任何类型的指针,因为bibo是对象,而vector对它们一无所知。

#include <iostream>
#include <vector>
template<typename T>
class MyClass
{
private:
std::vector<T*> myOwnVectors;

public:
void add(T* addedContainer)
{
myOwnVectors.push_back(addedContainer);
}

void displayMyContent() const
{
for (auto *j : myOwnVectors)
{
for (auto &&i : *j)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
}
};
int main()
{
MyClass<std::string> first;
std::string bi("Bing");
std::string bo("Bong");
first.add(&bi);
first.add(&bo);
bi[1] = 'a';
bo.push_back('g');

const MyClass<std::string> second = first;
first.displayMyContent();
}

在线代码在这里:https://rextester.com/IPZF36993

不幸的是,bibo的内存不是由向量自动管理的。您唯一的选择是使用共享指针。下面是这样一个问题的例子:

#include <iostream>
#include <vector>
template<typename T>
class MyClass
{
private:
std::vector<T*> myOwnVectors;

public:
void add(T* addedContainer)
{
myOwnVectors.push_back(addedContainer);
}

void displayMyContent() const
{
for (auto *j : myOwnVectors)
{
for (auto &&i : *j)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
}
};
template<typename T>
void problem(T &my_class_)
{
std::string be("Bend");
my_class_.add(&be);
be.push_back('y');
my_class_.displayMyContent(); // ok here
}
int main()
{
MyClass<std::string> first;
std::string bi("Bing");
std::string bo("Bong");
first.add(&bi);
first.add(&bo);
bi[1] = 'a';
bo.push_back('g');
problem(first);

first.displayMyContent(); //oops!
}

在线代码在这里:https://rextester.com/WYA69962

我的建议是重新考虑这个设计,以便向量存储实际的数据。如果希望其他类读取vector,可以提供返回const &的getter函数。希望对你有帮助。

相关内容

最新更新