更改C ++类构造函数参数的数量

时间:2012-03-15 03:42:47

标签: c++ constructor

我更像是一个C人,但我目前正在从事一个C ++项目。这就是为什么我有点困惑:

我们有这样的继承:
节点 - > MultiNode->迂回

现在有些代码(为简单起见,我几乎除了构造函数之外几乎省略了所有代码):

class MultiNode : public sim_mob::Node {
public:
    MultiNode(int x, int y) : Node(x, y) {}
...
}

class Roundabout : public sim_mob::MultiNode {
public:
    Roundabout() : MultiNode() {}
}

如您所见,Roundabout()构造函数在没有任何参数的情况下调用MultiNode()构造函数,而MultiNode只有一个带有2个args的构造函数:

  

MultiNode(int x,int y)

这种情况可能吗?请问扩张是什么?

此代码在其原始位置编译得很好但是当我将文件夹复制到测试区域以开始编辑时,我收到此错误(这对我来说是明智的): 错误:没有匹配函数来调用'sim_mob :: MultiNode :: MultiNode()

没有其他类似的文件或类可以怀疑错位。

错误供您参考:

~/workspace/parser5/geospatial$ make
Scanning dependencies of target driver
[ 33%] Building CXX object CMakeFiles/driver.dir/geo5-pskel.cxx.o
In file included from /home/vahid/workspace/parser5/geospatial/geo5-pskel.hxx:134:0,
                 from /home/vahid/workspace/parser5/geospatial/geo5-pskel.cxx:39:
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp: In constructor ‘sim_mob::Roundabout::Roundabout()’:
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: **error: no matching function for call to ‘sim_mob::MultiNode::MultiNode()’**
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: note: candidates are:
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note: sim_mob::MultiNode::MultiNode(int, int)
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note:   candidate expects 2 arguments, 0 provided
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note: sim_mob::MultiNode::MultiNode(const sim_mob::MultiNode&)
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note:   candidate expects 1 argument, 0 provided
make[2]: *** [CMakeFiles/driver.dir/geo5-pskel.cxx.o] Error 1
make[1]: *** [CMakeFiles/driver.dir/all] Error 2
make: *** [all] Error 2

谢谢

5 个答案:

答案 0 :(得分:1)

不,你不能这样做,因为没有默认构造函数可用于MultiNode。创建一个默认构造函数,它也不接受任何参数或为MultiNode构造函数提供一些默认参数。

 class MultiNode : public sim_mob::Node {
 public:
      MultiNode(int x, int y) : Node(x, y) {}
       ...
      MultiNode(){
      //....
      }
 };

 class MultiNode : public sim_mob::Node {
 public:
      MultiNode(int x = def_x, int y = def_y) : Node(x, y) {}
       ...
      MultiNode(){
      //....
      }
 };

答案 1 :(得分:1)

此错误与预期一致。

您只能使用存在的构造函数构造对象。在某些情况下,默认构造函数(零参数构造函数)将隐式生成为default,但在这种情况下不适用,因为您已经有了用户定义的构造函数。

答案 2 :(得分:1)

或者您可以从环形交叉口传递X,Y的默认值

class Roundabout : public sim_mob::MultiNode {
public:
    Roundabout() : MultiNode(0, 0) {}
    Roundabout(int x, int y) : MultiNode(x, y) {}
}

答案 3 :(得分:1)

不,你是对的,这没有意义。如果MultiNode没有默认构造函数,则无法从派生构造函数中调用它。你得到的错误信息是我所期望的,因此不清楚你的问题是什么。

你说“这段代码在其原始位置编译良好,但当我将文件夹复制到测试区域以开始编辑时,我收到此错误”。这让我想知道它的“原始位置”是什么,以及为什么你必须将它复制到某个地方进行编辑。您使用的是版本控制系统,还是更像是每个人都在攻击的共享文件夹中的代码的单个副本?如果是后者,则无法确保共享副本是最新的并且与每个人的更改保持一致;也许MultiNode 在该代码副本中有一个默认构造函数。

答案 4 :(得分:1)

在编译代码之前,您确定构建过程没有以某种方式修改代码吗?是否有一些预处理器宏可以创建默认构造函数(yuck),因为某些项目设置未定义,所以它不会被触发?

这些事情是我能想到的唯一可以导致代码编译的东西。

正如您所说,该代码不应该编译,因为默认构造函数不存在。