[英]“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.