我的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不存在默认构造函数。这是我的意图,但我不明白为什么它需要一个默认的构造函数。
答案 0 :(得分:5)
您不需要默认构造函数来通过引用传递对象。你的代码必须做其他需要这样的事情。
我的猜测是MyClass
的成员类型为Foo
。如果它不是默认构造的,那么它需要在其声明中或在构造函数的初始化列表中初始化:
MyClass::MyClass(const Foo& foo) : foo(foo) { ... }
^^^^^^^^
initialiser list
这假设该成员被称为foo
,并且它应该通过复制函数参数来实现。
答案 1 :(得分:0)
了解您正在使用的编译器,它符合哪种c ++标准以及MyClass
是否有其他构造函数将会很有帮助。
我能想象的是编译器不会生成默认构造函数MyClass()
,因为您已经定义了另一个构造函数。编译器是否想要像
class MyClass
的默认对象
class MyClass mc;
在没有MyClass::MyClass()
的情况下实现此目的的唯一方法是将上面的代码行视为
class MyClass mc( Foo() );
这需要class Foo
拥有默认构造函数。
我本来可以发表评论,但我还没有被允许。