C++:从 B 对象访问 A 类实例的数据成员(保存 B 类对象的列表)

标签 c++ oop

考虑以下代码:

#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/

相关文章:

c++ - move 后使用 unique_ptr

c++ - 此 C++ 代码给出了一个奇怪的警告

c++ - C++中调用析构函数和构造函数的顺序是什么

python - 用 flask 记录错误

python - 建议OOP分析/设计——打破我的程序习惯

在类的所有方法中将参数转换为相同标准的 Pythonic 方式

c++ - 在 C++ 中设置离散分布

c++ - 从基类调用基类中不存在的派生方法

oop - 如何在 OO 中建模

java - 如何根据从数据库中获取的数据一般地构造对象