“Никакой соответствующий конструктор по умолчанию доступная” ошибка в Visual C++

Если вы посмотрите документы NuGet для плагина Xamarin.Facebook , вы заметите, что они не обновляли стабильный пакет NuGet с 8/18/2015, т.е. четыре года назад

И последнее предварительный релиз был выпущен на 8/25/2015, что означает, что в основном Xamarin / Microsoft прекращает его действие как мертвый.

С другой стороны Xamarin.Facebook.Android все еще поддерживается, и, если я не ошибаюсь, был только что обновлен вчера.

Было бы разумно, если бы вы просто удалили Xamarin.Facebook Nuget и позаботились обо всех зависимостях, используя Android Nuget.

15
задан chustar 2 April 2009 в 16:12
поделиться

3 ответа

Должен использовать:

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;
   }
23
ответ дан 1 December 2019 в 00:21
поделиться

Значение по умолчанию 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++, Облегченного для больше.

22
ответ дан 1 December 2019 в 00:21
поделиться

Ответ является ответом dirkgently. Объяснение является последовательностью инициализации в C++.

При построении класса все базовые классы создаются сначала. Если Вы предоставите вызов конструктору в списке инициализации, то он вызовет соответствующего конструктора. Если базовый класс не появится в списке инициализации, то это будет созданное значение по умолчанию. Все это происходит прежде, чем ввести блок конструктора (фигурные скобки).

5
ответ дан 1 December 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: