Ctor по умолчанию — это тот, который можно вызывать без аргументов. По крайней мере, с этим кодом у вас его нет: ctor по умолчанию либо имеет подпись
ClassName::ClassName();
или каждый аргумент должен иметь значение по умолчанию.
Тем не менее, точка зрения Дирка о синтаксисе верна; если вы хотите вызвать 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;
}
... но это не работает? Почему? По сути, потому что то, что вы говорите С++, не имеет смысла: Package::Package
просто называет ctor суперкласса и ничего с ним не делает. Вы можете создать новый объект класса Package с помощью оператора new,
Package foo = new
Package::Package(sName, sAddress, sState, sCountry, sZIP,
rName, rAddress, rState, rCountry, rZIP,
weight, cost);
но это все еще не то, что вы хотите сделать; то, что вы хотите, — это сообщить C++, чтобы он конструировал части пакета TwoDayPackage, используя этот список аргументов. Вам не нужно иметь полное имя, потому что компилятор уже знает, что такое родительский класс.
Вы также можете просто присвоить значения в дочернем ctor, но это неэффективно, так как заставляет компилятор генерировать код для «многократных поездок в колодец». Итак, C++ имеет специальный синтаксис, в котором инициализаторы помещаются после двоеточия, как показал Дирк.
Еще одна вещь: поскольку вы все равно просто назначаете параметр квартире, вы можете сказать
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.
person
Charlie Martin
schedule
02.04.2009