繁体   English   中英

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);

将向量“数字”传递给循环程序是一种好的编程习惯吗? 有没有更好的方法来实现我的模板?

该代码实际上是要能够无限循环地遍历对象。 我的类是从仅调用成员方法的外部代码中调用的,并且我希望能够仅调用getNext(),因此不必使用索引。

在标准库中,存在另一个“模式”,它是迭代器模式 基本上,每种容器类型都实现beginend ,它们分别将迭代器返回到第一个元素和past-the-end元素(始终保证存在)。

这适用于每种容器类型,从std::vectorstd::array包括带有std::beginstd::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) {
        // …
    }
}

现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM