考虑以下代码:
#include <iostream>
#include <map>
class Value
{
public:
void set(const int intValue){ intValue_ = intValue; }
int read() const { return intValue_; }
void replaceIfInMap(){
std::map<int,int>::iterator it;
it = valuesToReplace_->find(intValue_);
if(it != valuesToReplace_->end()){
intValue_ = it->second;
}
}
Value(std::map<int,int>* valuesToReplace) : valuesToReplace_(valuesToReplace){}
private:
std::map<int,int>* valuesToReplace_;
int intValue_;
};
class Holder {
public:
void doStuffWithValues(){
Value a(&valuesToReplace_), b(&valuesToReplace_), c(&valuesToReplace_);
a.set(1); b.set(2); c.set(3);
valuesToReplace[2]=5;
a.replaceIfInMap(); b.replaceIfInMap(); c.replaceIfInMap();
std::cout << "a: " << a.read()
<< " b: " << b.read()
<< " c: " << c.read() << std::endl;
}
private:
std::map<int,int> valuesToReplace_;
};
int main()
{
Holder holder;
holder.doStuffWithValues();
}
我怎样才能以更方便(最好更优雅)的方式访问 valuesToReplace_
成员?我考虑过将 map 存储为 Value
类的公共(public)静态成员,但这会否认拥有多个 Holder
类实例的可能性,因为每个 Holder 实例都需要一组具有不同替换设置的 Value
实例。
全局 map 将是一个更丑陋的“解决方案”......
从 Holder
调用 Value::read()
并进行 map 交互没有选项,因为此代码只是一种简化,在实际代码中是等效的Value
的每个实例都可以存储指向同一类的其他实例的指针,从而导致上述方法过于复杂和庞大。
为什么上面的代码可以工作? Holder::valuesToReplace_
是私有(private)的!这只是正常的 C++ 行为吗(因为如果不访问类的私有(private)成员就无法获取该指针)?
最佳答案
Why does the above code even work? Holder::valuesToReplace_ is private!
它是私有(private)的,所以 Holder::doStuffWithValues 可以访问它,因为它是一个成员函数,没有错。
Value a(&valuesToReplace_), b(&valuesToReplace_), c(&valuesToReplace_);
a.set(1); b.set(2); c.set(3);
在这里,您所有的 Value 对象都有指向同一张 map 的 valuesToReplace_ 是您想要的吗?这看起来很奇怪,我要么有一个静态映射(它会在赋值时制作一个拷贝),要么有一个智能指针来防止意外删除(但允许 NULL 值)。
How could I get access to the valuesToReplace_ member in a more convenient (and preferably more elegant) way?
您可以将其设为私有(private)并拥有公共(public)成员函数,这些成员函数返回 map 的开始/结束 const_iterators,或者不依赖于内部实现的 setIntForInt/getIntForInt 访问器方法。
关于C++:从 B 对象访问 A 类实例的数据成员(保存 B 类对象的列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257770/