簡體   English   中英

C ++類構造函數參數數量的變化

[英]change in the number of C++ class constructor arguments

我更像是一個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個參數的構造函數:

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

謝謝

不,您不能這樣做,因為沒有默認的構造函數可用於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(){
      //....
      }
 };

此錯誤是預期的。

您只能使用存在的構造函數構造對象。 在某些情況下,默認構造函數(零參數構造函數)將作為default隱式生成,但是在這種情況下不適用,因為您已經具有用戶定義的構造函數。

或者,您可以從回旋處傳遞X,Y的默認值

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

不,您是對的,那沒有道理。 如果MultiNode沒有默認的構造函數,則無法從派生的構造函數調用一個。 您收到的錯誤消息正是我所期望的,因此不清楚您的問題是什么。

您說“此代碼在其原始位置編譯良好,但是當我將文件夾復制到測試區域以開始編輯時,出現此錯誤”。 這使我想知道它的“原始位置”是什么,以及為什么必須將其復制到某個地方才能對其進行編輯。 您是在使用版本控制系統,還是更像是每個人都在其中共享文件夾中的代碼的單個副本? 如果是后者,則您將無法確保共享副本是最新的並且與每個人的更改保持一致; 也許MultiNode在該代碼副本中確實具有默認構造函數。

您確定編譯過程沒有在編譯之前以某種方式修改代碼嗎? 是否有一些預處理器宏可以創建由於未定義某些項目設置而不會觸發的默認構造函數(yuck)?

這些事情是我能想到的唯一會導致代碼編譯的事情。

如您所說,該代碼不應編譯,因為默認構造函數不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM