在不构造实例变量的情况下,在C中声明实例变量的好方法是什么?

在不构造实例变量的情况下,在C中声明实例变量的好方法是什么?,第1张

概述我一直在互联网上搜索这个话题,我还没有真正得到一个坚定的答案.作为一个C#程序员,我习惯于在大范围内声明类,通常在文件顶部附近,在任何函数之外,然后在使用时构造它们. 转到C之后,复制它的唯一方法是使用默认构造函数,这很好,但在某些情况下,我宁愿使用一个构造函数,它需要参数而不是一个无参数的默认构造函数. 在互联网上寻找解决方案之后,我遇到了一些建议,这些建议有其缺陷: 1.指针 有些人建议在所需 我一直在互联网上搜索这个话题,我还没有真正得到一个坚定的答案.作为一个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 ctorcclass 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.

但是不要这样做,不要使用全局变量……

总结

以上是内存溢出为你收集整理的在不构造实例变量的情况下,在C中声明实例变量的好方法是什么?全部内容,希望文章能够帮你解决在不构造实例变量的情况下,在C中声明实例变量的好方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存