C++只能实例化1个对象的类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++只能实例化1个对象的类相关的知识,希望对你有一定的参考价值。
帮我写1个类(最好简单易懂的),确保该类实例化的对象数目最多只能有1个,最好把题目也解释1下,看不懂,谢谢啦
实例化对象是指是指用这个类来定义一个具体的事物.如何确保它的实例化对象只得一个?
可以通过使用静态变量的办法在类中加一个静态变量,然后在类的构造函数中做一下判断就好了
class
a
a()
static
a=0;
if(a==0)
初始化对象;
else
不能初始化对象,当前内存中多于一个些类的对象;
; 参考技术A 一,这是一个编程的术语,面向对象的编程似乎都使用这一个名词。
二,实例化,其实就是根据预编制的类,创建一个新的对象。叫实例化。
比如说 dim MyClassName1 = new MyClassName 参考技术B 不是的,
可以很多,
但是每个类是单一使用的 参考技术C class CSingleton:
// 其它成员
public:
static CSingleton * GetInstance()
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
private:
CSingleton();
static CSingleton * m_pInstance;
单例类CSingleton有以下特征:
它有一个指唯一实例的静态指针m_pInstance,并且是私有的。
它有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例。
它的构造函数是私有的,这样就不能从别处创建该类的实例。本回答被提问者采纳
从 C++ 到 C# 的面向对象设计帮助
【中文标题】从 C++ 到 C# 的面向对象设计帮助【英文标题】:Object Oriented Design help from C++ to C# 【发布时间】:2008-11-19 22:39:32 【问题描述】:嘿,我通常会遇到这样一种情况,即我将创建一个只能由一个或几个类实例化的类。在这种情况下,我会将其构造函数设为私有,并使其成为应该能够实例化它的对象的朋友类。例如(在 C++ 中):
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;
所以我的问题是:这很愚蠢吗?还是有更好的方法来实现这一目标?考虑到该语言完全缺少friend关键字,我对它与C#一起使用的方式特别感兴趣。谢谢。
【问题讨论】:
你的代码有一个错误:朋友声明应该在CFoo类中(你只能说“这个类是我的朋友”,而不是“我是这个类的朋友”) . 【参考方案1】:这里的目标似乎是,除非你有一个有效的 CBar,否则你不可能有一个 CFoo。
您可以使用 C# 实现相同的效果,方法是为 CFoo 提供一个私有构造函数,然后在 CFoo 中创建一个静态方法,该方法接受一个 CBar 参数并调用所述构造函数并返回新的 CFoo。
这类似于 System.Drawing.Graphics.FromImage(Image image) 方法。
C#为什么没有friend关键字的问题已覆盖elsewhere。
【讨论】:
【参考方案2】:在 C# 中,根据类的使用方式,您可以在另一个类的范围内定义一个类。
public class CBar
CBar()
m_pFoo = new CFoo();
CFoo m_pFoo;
private class CFoo
CFoo()
// Do stuff
【讨论】:
“只能由一个或几个类实例化” 这会将其限制为恰好一个。 不喜欢嵌套类...这也是一种耦合,不是吗 我个人不喜欢嵌套类。只是指出如果需要可以这样做。【参考方案3】:你可以看看在内部标记 CFoo
internal class CFoo
可能适合您的需要。正如@g 所说,您可以在类中嵌套类,但恕我直言,这有点代码味道。
【讨论】:
【参考方案4】:仅仅因为只有少数特定的类使用 CFoo,并不意味着您应该明确阻止其他人使用它。如果这确实是需要,您可能需要重新考虑您的设计。您绝对不想在您的代码中强制进行如此大量的耦合。请详细说明您为什么这样做,以便我们更好地提出一个好的解决方案?
【讨论】:
【参考方案5】:为了帮助思考它是否愚蠢,您能否提供更具体的示例来说明这些类是什么?
我会说没有充分理由使用朋友对我来说有点奇怪......在C#中你有一个汇编这样的东西,所以你可以使用内部构造函数或私有构造函数和几个静态创建方法具有不同的访问权限(受保护的、公共的、内部的......)
【讨论】:
【参考方案6】:首先,朋友声明在错误的类中。 CFoo 需要与 CBar 成为好友才能让 CBar 访问它的私有成员。
其次,是的,通常应该避免这种情况。类应该很少关心它们的使用方式/位置。如果他们这样做了,那么该功能可能应该以不同的方式分解。
【讨论】:
【参考方案7】:只需将课程设为私有即可。这只是将范围限制为您的 dll(exe 等)。没有什么比 C# 中的朋友声明更酷了,但 Marcin 是正确的,您应该重新考虑这样的设计。如果你真的需要“朋友”的支持,你可以在运行时使用反射来模拟它。
【讨论】:
以上是关于C++只能实例化1个对象的类的主要内容,如果未能解决你的问题,请参考以下文章