为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?

Posted

技术标签:

【中文标题】为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?【英文标题】:Why do we need a default constructor to pass an object by reference in C++?为什么我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象? 【发布时间】:2014-11-18 01:09:53 【问题描述】:

当我尝试以下操作时,我的 C++ 编译器给我一个错误“没有类 Foo 的默认构造函数”。

MyClass::MyClass(const Foo& foo) ...

如果我正在传递一个引用,那么该对象应该已经被初始化了,对吗?复制构造函数不是问题,因为我明确定义了一个。那么为什么需要一个默认构造函数来传递引用呢?

我唯一能想到的是它可能不知道要为它分配多少内存。如果这是问题所在,有没有办法告诉编译器我只打算动态分配这个对象?我无法在网上找到任何答案,非常感谢您的帮助。

编辑:我只是要在我的实际代码中进行编辑。

会员管理器.cpp:

#include "MemberManager.h"

MemberManager::MemberManager(const NodeManager& nodeSet, std::vector<int> cctMat, int n)

    for(int i = 0; i < n; i++)
    
        memSet[i] = Member();
    

NodeManager.h

#include "Node.h"

class NodeManager

public:
    //constructors
    NodeManager(std::vector<double> crdMat, std::vector<Constraint> cstMat, int n):
        nodeSet(n) ;
    //copy
    NodeManager(const NodeManager& src):
        nodeSet(src.nodeSet) ;

我的准确错误消息是 MemberManager::MemberManager(...) 的第一个主体括号下的红色下划线,它表示 NodeManager 不存在默认构造函数。这是我的意图,但我不明白为什么它需要一个默认构造函数。

【问题讨论】:

这是什么语言? 你也应该像我一样添加c++标签。 您已经展示了MyClass 的构造函数,它接受Foo 作为输入。 Foo 有什么样的构造函数?当您收到错误时,对 MyClass 构造函数的调用是什么样的?编译器试图告诉您您正在传递一些它无法构造 Foo 的东西。 您发布的极短代码示例很好:ideone.com/zHgTLp。请编辑足够的代码以复制此问题。我怀疑您正在尝试默认构造 Foo somwhere。 @Bbqsauce 我发布的链接显示您的 OP 中的代码编译。请编辑足够的代码来复制您的问题。 【参考方案1】:

您不需要默认构造函数来通过引用传递对象。您的代码必须执行其他需要此类操作的操作。

我猜MyClass 有一个Foo 类型的成员。如果它不是默认可构造的,则需要在其声明中或在构造函数的初始化列表中对其进行初始化:

MyClass::MyClass(const Foo& foo) : foo(foo)  ... 
                                   ^^^^^^^^
                                   initialiser list

这假定该成员被称为foo,并且应该通过复制函数参数来初始化它。

【讨论】:

如果可以的话,我会支持你。这确实是问题所在,但我对错误的显示位置感到困惑。非常感谢!【参考方案2】:

了解您正在使用什么编译器、它符合哪个 c++ 标准以及您是否有其他 MyClass 的构造函数会很有帮助。

我可以想象的是编译器不会生成默认构造函数MyClass(),因为您已经定义了另一个构造函数。编译器是否应该像在

中那样生成 class MyClass 的默认对象
class MyClass mc;

在没有MyClass::MyClass() 的情况下完成此操作的唯一方法是将上面的代码行视为

class MyClass mc( Foo() );

这要求class Foo 有一个默认构造函数。

我本可以对此发表评论,但我还不允许这样做。

【讨论】:

我正在使用 Visual Studio Express 2013 和 c++11。当我调用 MyClass 构造函数时,该错误不会发生,它只是在正文的第一个括号中添加了红色下划线。我还没有打电话。 MyClass:MyClass(const Foo& foo)s 也是迄今为止唯一的构造函数和类中唯一的方法。 为了验证我上面的论点是否正确,您可以为 MyClass 添加一个默认构造函数吗?即使这对您的类没有意义,也有各种不明显的场合使用默认构造函数,您可能会发现需要一个。

以上是关于为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 构造函数在继承中需要默认参数?

在 c++ 中的菱形问题中,为啥我们需要从子类中调用祖父构造函数?

在 C++ 中通过构造函数复制类

为啥 g++ 需要 -fpermissive 标志来在 c++ 中打印迭代器值? [关闭]

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

为啥 BroadcastReceiver 需要一个默认构造函数?