gpt4 book ai didi

c++ - 在 C++ 中声明实例变量而不构造它们的好方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:45 24 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




8年前关闭。




我一直在互联网上搜索这个话题很多,我还没有真正得到一个明确的答案。作为一名 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++ 中寻找的。

再次感谢。

最佳答案

这是一个非常坏的习惯(用对象替换类):

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# 这也是坏习惯。如果你使用对象而不定义它会怎样——你会得到空引用异常——为什么要玩这么危险的事情。

顺便说一句,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++ 中声明实例变量而不构造它们的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com