代码之家  ›  专栏  ›  技术社区  ›  Game_Overture

面向对象的设计:从C++到C语言的帮助

  •  1
  • Game_Overture  · 技术社区  · 16 年前

    class CFoo
    {
        friend class CFoo;
    
        // private ctor because only a select few classes should instantiate
        private:
        CFoo()
        {
            ... Do stuff
        }
    }
    
    class CBar
    {
        // CBar is one of the few classes that only need to use CFoo
    
        CFoo *m_pFoo;
    
        CBar()
        {
            m_pFoo = new CFoo;
        }
    }
    

    所以我的问题是:这是愚蠢的吗?还是有更好的方法来实现这一点?考虑到C语言完全缺少friend关键字,我特别感兴趣的是它能与C语言一起工作。谢谢

    7 回复  |  直到 13 年前
        1
  •  2
  •   Community CDub    7 年前

    这里的目标似乎是,在拥有一个有效的CBar之前,你不可能拥有一个CFoo。

    使用C#可以实现同样的效果,方法是为CFoo创建一个私有构造函数,然后在CFoo中创建一个静态方法,该方法接受CBar参数并调用该构造函数并返回新的CFoo。

    这类似于System.Drawing.Graphics.FromImage(图像图像)方法。

    为什么C#没有friend关键字的问题已经被讨论过了 elsewhere .

        2
  •  1
  •   g .    16 年前

    在C#中,根据类的使用方式,可以在另一个类的范围内定义一个类。

    public class CBar
    {
        CBar()
        {
            m_pFoo = new CFoo();
        }
    
        CFoo m_pFoo;
    
        private class CFoo
        {
            CFoo()
            {
                // Do stuff
            }
        }
    }
    
        3
  •  1
  •   JamesSugrue    16 年前

    您可以查看标记CFoo内部

    internal class CFoo
    
    • 那可能适合你的需要。正如@g所说,您可以在类中嵌套类,但这有点代码味道。
        4
  •  0
  •   Marcin    16 年前

        5
  •  0
  •   Paul Kapustin    16 年前

    为了帮助思考它是否愚蠢,你能提供更具体的例子说明这些类是什么吗?

    我想说的是,在没有充分理由的情况下使用friend对我来说有点奇怪……在C#中,你有汇编这样的东西,所以你可以使用内部构造函数或私有构造函数,以及几种具有不同访问权限的静态创建方法(受保护的、公共的、内部的…)

        6
  •  0
  •   Greg Rogers    16 年前

    首先,朋友声明在错误的类中。CFoo需要成为CBar的朋友,以便CBar能够访问其私人成员。

    第二,是的,一般来说,这应该避免。类应该很少关心如何/在何处使用它们。如果他们这样做了,那么该功能可能应该以不同的方式分解。

        7
  •  0
  •   chilltemp    16 年前

    只需把课堂保密。这只是将范围限制在dll(exe等)上。没有什么比C#中的朋友声明更酷的了,但是Marcin说得对,你应该重新考虑这样的设计。如果您确实需要“friend”支持,您可以在运行时使用反射来模拟它。