C++将成员变量传递给成员类
C++ Passing a member variable to a member class
我有一些遗留代码,其中使用了类似的方法来循环遍历顺序容器(本例中为向量。一些实现使用其他类型的容器)。所以我把它分解成一个模板,这样我就可以对任何容器类型重用同一段代码。
template<template<class, class> class TContainer, class TObject>
class cycle
{
public:
explicit cycle( TContainer<TObject, std::allocator<TObject>> & container )
: mContainer( container ), index(0) {}
TObject getNext(int numObjectsToCycle)
{ return mContainer[index++ % numObjectsToCycle]; }
private:
TContainer<TObject, std::allocator<TObject>> & mContainer;
int index;
};
然后,我们班有一个循环器来循环我的变量。
class myClass
{
std::vector<int> numbers;
public:
cycle<vector, int> cycler;
// Is it safe to pass numbers since it is declared first??
myClass() : cycler(numbers) {}
};
然后,我使用如下代码
myObject.cycler.getNext(size);
将矢量"数字"传递给cycler是一种很好的编程实践吗?有没有更好的方法来实现我的模板?
代码实际上是能够无限循环通过对象。我的类是从只调用成员方法的外部代码中调用的,我希望能够只调用getNext(),这样我就不必使用索引了。
在标准库中存在另一个"模式",它是迭代器模式。基本上,每个容器类型都实现了begin
和end
,它们分别向第一个元素和最后一个元素返回迭代器(始终保证存在)。
这适用于从std::vector
到std::array
的每种容器类型,包括具有std::begin
和std::end
的C样式数组。如果你想在一个通用容器中循环,你可以这样做,例如:
template<typename Container>
void cicle(Container const& c) {
for (auto const& i : c) {
// …
}
}
或者,为了更好地可视化模式:
template<typename Container>
void cicle(Container const& c) {
for (auto it = std::begin(c); it != std::end(c); ++it) {
// …
}
}
现场演示
相关文章:
- 为什么在C++中首先初始化成员类
- 我正在尝试获取类私有成员中变量的输入
- 模板类变量作为非模板类的成员
- 从静态成员函数访问私有非静态类变量 - C++
- 无法使用子类变量访问超类公共成员
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 从成员变量更新类变量或调用类功能是给出运行时错误
- 如何使用unique_ptr访问C++中的类成员和类变量
- 如何通过其他.cpp文件中的类变量编辑公共成员变量
- 对成员类/对象变量使用指针更好吗
- 返回类成员引用变量会导致运行时错误
- 将pthread_mutex_t和pthread_cond_t作为类成员静态变量的任何缺点
- 声明为类变量的对象没有可用的成员
- 继承类的成员函数不会更改继承的基类变量
- 作为类成员的 C++ 类变量
- 类成员引用变量是否有内置"const-correctness"?
- 如何在继承类中创建父类变量数组作为私有成员
- 一个函数可以访问的类变量或成员函数中仍然是对象感知的静态变量
- 是在第一次调用静态成员函数之前初始化的静态类变量
- C++将成员变量传递给成员类