繁体   English   中英

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

[英]Why do we need a default constructor to pass an object by reference in C++?

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

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

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

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

编辑:我只是想在我的实际代码编辑。

MemberManager.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没有默认构造函数。 这是我的意图,但我不明白为什么它需要一个默认的构造函数。

您不需要默认构造函数来通过引用传递对象。 你的代码必须做一些需要这样的事情。

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

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

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

知道你正在使用什么编译器,它符合哪个c ++标准以及你是否有其他MyClass构造函数会很有帮助。

我能想象的是编译器不会生成默认构造函数MyClass()因为您已经定义了另一个构造函数。 编译器是否想要生成class MyClass的默认对象

class MyClass mc;

在缺少MyClass::MyClass()的情况下实现此目的的唯一方法是将上面的代码行视为

class MyClass mc( Foo() );

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

我本来是一个评论,但我还没有被允许。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM