为啥我们需要一个默认构造函数来在 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++ 中的菱形问题中,为啥我们需要从子类中调用祖父构造函数?
为啥 g++ 需要 -fpermissive 标志来在 c++ 中打印迭代器值? [关闭]