【问题标题】:Implementing Friend Functions实现朋友功能
【发布时间】:2015-12-15 13:44:59
【问题描述】:

我有两个课程HumidityTemperature。他们有友元函数,在他们的头文件中声明:

friend
void PrintWeather(const Temperature &cTemperature, const Humidity &cHumidity);

哪里方便实现功能(Temperature.cppHumidity.cppanother_file.cpp)?

【问题讨论】:

    标签: c++ friend-function


    【解决方案1】:

    由于函数PrintWeather 没有逻辑耦合 对于一个类而不是另一个类,我会在一个单独的文件中实现它,也许是weather.cpp。我用小写表示该文件不包含类Weather,而是包含与天气相关的函数。

    另外,我强烈建议对所有这些都使用像 weather 这样的命名空间。

    如果不知道您展示的更多内容,我会质疑您的设计。为什么PrintWeather 需要访问TemperatureHumidity 的内部?它应该只使用这两者的公共接口。

    【讨论】:

    • 这只是朋友函数教程中的一个例子。我一直对在这种情况下使用什么方法很感兴趣。
    • 或将文件命名为output_functions.cpp。或者更好的是,创建一个包含TemperatureHumidity 对象作为字段的WeatherForecast 类,该类具有Print 函数。
    【解决方案2】:

    PrintWeather 函数的名称暗示它在谈论称为Weather 的东西。所以也许你应该把Weather(或WeatherForecast)做成一个单独的类,它收集天气的所有组成部分:

    class Weather
    {
      private: 
        Temperature temperature;
        Humidity humidity;
    
      public:
        void Print();
        // or: void Print(std::ostream& out) const;
    }
    

    注意函数的名称现在可以简单地是Print - 什么它打印的内容已经从它所在的类中清楚了,而不是尴尬

    weatherForecast.PrintWeather();
    

    你会写

    weatherForecast.Print();
    

    现在,如果您的任务要求您这样做,您可以授予 Weather friend 访问 TemperatureHumidity 的权限。但是,我想指出的是,在实际设计中,您要尽可能避免friends(俗话说:“你不想让你的朋友碰你的私处” - 只需为TemperatureHumidity 提供适当的public 接口)。

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 2010-10-11
      • 2015-09-29
      • 2011-04-17
      • 2010-10-11
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多