Если вы посмотрите документы NuGet для плагина Xamarin.Facebook , вы заметите, что они не обновляли стабильный пакет NuGet с 8/18/2015
, т.е. четыре года назад
И последнее предварительный релиз был выпущен на 8/25/2015
, что означает, что в основном Xamarin / Microsoft прекращает его действие как мертвый.
С другой стороны Xamarin.Facebook.Android все еще поддерживается, и, если я не ошибаюсь, был только что обновлен вчера.
Было бы разумно, если бы вы просто удалили Xamarin.Facebook Nuget и позаботились обо всех зависимостях, используя Android Nuget.
Должен использовать:
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 любой имеет подпись
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;
}
... но это не работает? Почему? В основном, потому что, что Вы говорите, C++ не имеет смысла: Package::Package
просто называет ctor суперкласса и не делает что-либо с ним. Вы могли создать новый объект класса Пакет при помощи нового оператора,
Package foo = new
Package::Package(sName, sAddress, sState, sCountry, sZIP,
rName, rAddress, rState, rCountry, rZIP,
weight, cost);
но это все еще не, что Вы хотите сделать; то, что Вы хотите, должно сказать C++ создавать части Пакета TwoDayPackage с помощью того списка аргумента. У Вас не должно быть полностью определенного имени, потому что компилятор уже знает, каков родительский класс.
Вы могли также просто присвоить значения в дочернем 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)
{
}
Проверьте этот раздел FAQ C++, Облегченного для больше.
Ответ является ответом dirkgently. Объяснение является последовательностью инициализации в C++.
При построении класса все базовые классы создаются сначала. Если Вы предоставите вызов конструктору в списке инициализации, то он вызовет соответствующего конструктора. Если базовый класс не появится в списке инициализации, то это будет созданное значение по умолчанию. Все это происходит прежде, чем ввести блок конструктора (фигурные скобки).