#include <iostream>
#include <map> // or <unordered_map>
#include <string>

class C{
public:
    C* linked1;
    C* linked2;

    std::map<std::string, double> values; // or std::unordered_map
    
    C(double d1, double d2) {
        values["d1"] = d1;
        values["d2"] = d2;
    }

    double add(const std::string& name) const {
        return linked1->values.at(name) + linked2->values.at(name) + values.at(name);
    }
};


int main() {
	C c1{1., 2.};
	C c2{3., 4.};
	C c3{5., 6.};

	c1.linked1 = &c2;
	c1.linked2 = &c3;

	double a1 = c1.add("d1");
	double a2 = c1.add("d2"); 

	std::cout << a1 << std::endl;
	std::cout << a2 << std::endl;

	return 0;
}