在A类中,有一个向量V. V是私人会员。
在B级,我想打印V的所有项目。 这样做的最佳方式是什么?
在同一个类中获取向量的迭代器非常容易,但在另一个类中却不容易。
感谢您的阅读。
答案 0 :(得分:5)
明白你的观点:
很容易得到一个迭代器 同一类中的向量,但不是 在另一堂课很容易。
(并且假设想要打印元素只是一个其他复杂动作的占位符)
您仍然可以通过A
从B
内部typedef
公开您class A
{
private:
std::vector<int> V;
public:
typedef std::vector<int>::const_iterator const_iterator;
const const_iterator begin() const
{
return V.begin();
}
const const_iterator end() const
{
return V.end();
}
};
矢量的迭代器,例如
class B
{
public:
void Foo()
{
A a;
// do stuff that will put things into the collection inside 'a'
std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
}
};
然后你可以使用这样的迭代器:
const_iterator
我在这种情况下使用了iterator
,因为您要求进行只读访问,但如果您需要写访问权限,则可以使用{{1}}(尽管这可能是一个糟糕的设计选择写给那样的内部成员。)
答案 1 :(得分:3)
我拥有矢量,打印它是由A决定的。尽可能少地曝光,尤其是私人会员。
另一种选择是访客模式;这样可以保持数据的封装,同时又具有很大的灵活性。
struct A {
template< typename F > void each( F& f ) const {
std::for_each( data.begin(), data.end(), f );
}
private:
std::vector<int> data;
};
struct B : public A {
static void tprint()( int i ) { std::cout<<i<<std::endl; }
void print()const {
each( tprint );
}
};
答案 2 :(得分:2)
如果B
想要打印A
的向量,那就是A
的请求,因此A
应该在其公共接口中有一个方法来实现这一点,例如(例如V
的类型为vector<int>
):
class A {
…
public:
void dump_values(std::ostream& out) const {
std::copy(V.begin(), V.end(), std::ostream_iterator<int>(out, " "));
}
}
答案 3 :(得分:1)
如果V是私人会员,那么你必须问为什么你想从课外到达它?为避免违反此数据的封装,您有以下几种选择:
E.g。 :
A::printInternalData( const B& printer ) { printer.print( V ); };
除此之外,你必须将V暴露给外界。
答案 4 :(得分:0)
如何实现返回向量迭代器的this_stuff_begin()
和this_stuff_end()
成员呢?目前尚不清楚将其私有化的用途是什么......
答案 5 :(得分:-1)
在不太了解A类和B类职责的细节的情况下,我建议A类返回对B类存储的向量的const引用。这使您可以对向量进行只读访问,而不需要复制的表现。
class B
{
private:
std::vector<int> m_vector;
public:
const std::vector<int>& GetVector() {return m_vector}
}
class A
{
private:
B m_b;
public:
void printVector()
{
const std::vector<int>& refToVec = m_b.GetVector();
std::vector<int>::const_iterator iter = refToVec.begin();
for (; iter != refToVec.end(); ++iter)
{
std::cout << *iter << std::endl;
}
}
}