簡體   English   中英

“Visual C ++中沒有適當的默認構造函數”錯誤

[英]“No appropriate default constructor available” error in Visual C++

我不明白。 我一直盯着代碼代碼三個小時,我看不出問題。

我正在創建的類叫做TwoDayPackage,它派生自一個名為Package的類。

這是我定義構造函數的方式:

    TwoDayPackage(string, string, string, string, int, string, string, string, string, int, float, float, float);

這是我實現構造函數的方式:

TwoDayPackage::TwoDayPackage(string sName, string sAddress, string sState, string sCountry, int sZIP, string rName, string rAddress, string rState, string rCountry, int rZIP, float weight, float cost, float flat)
{
Package::Package(sName, sAddress, sState, sCountry, sZIP, rName, rAddress, rState, rCountry, rZIP, weight, cost);
flatRate = flat;
}

這是我在我的主要功能中使用它的方式。

TwoDayPackage pack2(senderName, senderAddress, senderState, senderCountry, senderZIP, receipientName, receipientAddress, receipientState, receipientCountry, receipientZIP, weight, cost, flat);

我知道我的論點清單很長,這是有原因的。 謝謝。

應該使用:

TwoDayPackage::TwoDayPackage(string sName, string sAddress, string sState, string  sCountry, int sZIP, string rName, string rAddress, string rState, string rCountry, int rZIP, float weight, float cost, float flat)
 :Package(sName, sAddress, sState, sCountry, sZIP, rName, rAddress, rState, rCountry, rZIP, weight, cost)
  {
    flatRate = flat;
   }

默認的ctor是可以不帶參數調用的ctor。 至少使用此代碼,您沒有:默認的ctor要么具有簽名

ClassName::ClassName();

或者每個參數都必須有默認值。

也就是說,Dirk關於語法的觀點是正確的; 如果你想調用父類ctor,你應該在冒號后執行。


@dirkgently的答案顯示了正確的語法,但讓我們稍微擴展一下。 你有兩節課

public class Package {
    // ...
    Package( /* that horrible ctor arg list */){/*...*/}
    // ...
}

public class TwoDayPackage : public Package {
    // ...
    TwoDayPackage(/* another horrible ctor */);  // declaration only
    // ...
}

然后你來定義它

TwoDayPackage::TwoDayPackage(string sName, string sAddress, 
                             string sState, string sCountry, 
                             int sZIP, string rName, 
                             string rAddress, string rState, 
                             string rCountry, int rZIP, 
                             float weight, float cost, float flat)
{

     Package::Package(sName, sAddress, sState, sCountry, sZIP, 
                      rName, rAddress, rState, rCountry, rZIP, 
                      weight, cost);
     flatRate = flat;
}

......但那不起作用? 為什么? 基本上,因為你所說的C ++沒有意義: Package::Package只是命名超類的ctor並且沒有對它做任何事情。 您可以使用new運算符創建類Package的新對象,

     Package foo = new
         Package::Package(sName, sAddress, sState, sCountry, sZIP, 
                          rName, rAddress, rState, rCountry, rZIP, 
                          weight, cost);

但那仍然不是你想要做的; 想要的是告訴C ++使用該arg列表構建TwoDayPackage的Package部分。 您不需要具有完全限定名稱,因為編譯器已經知道父類是什么。

您也可以在子ctor中分配值,但這樣效率很低,因為它使編譯器生成“多次訪問井”的代碼。 所以C ++有一個特殊的語法,其中初始化器放在冒號后面,正如Dirk所示。

還有一件事:你可以說,因為你只是將參數分配到平面上

TwoDayPackage::TwoDayPackage(string sName, string sAddress, 
                             string sState, string sCountry, 
                             int sZIP, string rName, 
                             string rAddress, string rState, 
                             string rCountry, int rZIP, 
                             float weight, float cost, float flat) :
    Package(sName, sAddress, sState, sCountry, sZIP, 
            rName, rAddress, rState, rCountry, rZIP, weight, cost),
    flatRate(flat) 
{
}

有關更多信息,請查看C ++ FAQ Lite的此部分

答案是dirkgently 解釋是C ++中的初始化序列。

構造類時,首先構造所有基類。 如果在初始化列表中提供對構造函數的調用,那么它將調用相應的構造函數。 如果基類沒有出現在初始化列表中,那么它將是默認構造的。 所有這些都進入構造函數塊(花括號) 之前發生。

暫無
暫無

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

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