【发布时间】:2012-10-05 21:45:53
【问题描述】:
我一直在互联网上搜索这个主题,但我还没有真正找到一个确定的答案。作为主要的 C# 程序员,我习惯于在大范围内声明类,通常在文件顶部附近,在任何函数之外,然后在使用时构造它们。
在转向 C++ 之后,复制它的唯一方法是拥有一个默认构造函数,这很好,但在某些情况下,我宁愿拥有一个需要参数的构造函数,而不是一个无参数的默认构造函数。
在互联网上搜索解决方案后,我遇到了一些建议,它们有缺陷:
1.指针
有人建议在想要的范围内有一个动态指针,然后在构造的时候将指针指向类的位置。
CClass* pClass = 0;
int main()
{
pClass = new CClass(1337);
delete pClass;
return 0;
}
这种方法的问题是你必须记住在之后删除指针,因此,静态指针更“安全”。另外,我猜这样做会产生轻微的内存开销,尽管不会太多,因为有指针。
2。无论如何都有一个默认构造
有时建议使用默认构造函数,它将类中的所有内容归零:
class CClass
{
public:
CClass() : leetNumber(0) {}
CClass(int leetNumber) : leetNumber(leetNumber) {}
private:
int leetNumber;
};
//Defaults leetNumber to 0 through default ctor
CClass myClass;
int main()
{
myClass = CClass(1337);
return 0;
}
但是,如果您不能将课堂内的所有内容都归零,会发生什么?如果你有另一个类不能被初始化为空怎么办?如果用户试图在没有正确初始化成员的情况下访问类中的函数,你会怎么做? (你可以检查一下,但我相信这需要太多代码,尤其是如果你有很多成员)。
3.停留在更小、更本地化的范围内
有人建议人们说要保持在小范围内,将类作为引用传递给可能需要它的其他函数,并在声明类后立即构造:
class CClass
{
public:
CClass(int leetNumber) : leetNumber(leetNumber) {}
int getLeetNumber() { return leetNumber; }
private:
int leetNumber;
};
bool GetMuchNeededAmazingNumberFromClass(CClass& myClass)
{
if(myClass.getLeetNumber() == 1337)
return true;
return false;
}
int main()
{
CClass myClass = CClass(1337);
if(!GetMuchNeededAmazingNumberFromClass(&myClass);
return 1;
return 0;
}
从某种意义上说,这很好,您可以看到什么函数需要什么,但我可以想象一个函数需要大量具有大量所需参数的外部类。
还有更多示例,但我似乎找不到可以依赖的示例,尤其是来自 C# 背景的示例,这些示例既好用又简单。
谢谢。
编辑:
让我详细说明我的要求 - 在 C# 中,您可以执行以下操作:
public class Program
{
//See how I'm able to do this, without calling the ctor.
static AmazingClass amazing;
public static void Main()
{
//And then call the constructor when I want.
amazing = new AmazingClass(1337);
}
}
这允许我创建类而不实际构造它,这就是我在 C++ 中寻找的。p>
再次感谢。
【问题讨论】:
-
我认为您的意思是“声明实例变量而不构造它们”。声明类意味着别的东西。
-
我不确定您要解决的实际外部问题是什么。为什么一个典型的函数需要的成员不止是极少数的类?您通常不需要告诉该函数哪些它应该操作这些类的成员吗?你真的需要多久构造一个类的实例来执行一个操作?
-
我真的不确定这里的问题是什么。
-
您应该研究智能指针。有几种类型,它们会在您完成后删除您的对象。
-
在(好的)C++ 中,我们不再直接使用
new,请参阅make_unique和make_shared。编辑:根据您的编辑,您要寻找的只是动态内存管理。 C# 隐含地(在一定程度上)对类类型执行此操作。