转到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中寻找的.
再次感谢.
解决方法
I’m used to declaring objects in a large
scope,typically near the top of the file,outside any functions,and
then constructing them when in use.
忘掉它.在需要时定义对象.
int main() { A a; ...a... A b; ...b... }
这是C思考.
我相信C#也是一种坏习惯.如果您在没有定义对象的情况下使用对象会怎么样 – 您将获得空引用异常 – 为什么要玩这样危险的东西.
BTW,C等价于C#对象是shared_ptr:
std::shared_ptr<A> a; int main() { a = std::make_shared<A>(...); // do not need to call delete }
在C中,如果不需要共享对象,也可以使用std :: unique_ptr.
但是不要这样做,不要使用全局变量……