Похоже, вы пытаетесь решить проблему, которая пытается научить вас дескрипторам. Посмотрите https://docs.python.org/3.7/howto/descriptor.html для получения более подробной информации.
Но все, что нужно для задачи, для которой вы пишете решение:
class Celsius:
def __get__(self, obj, objtype):
return ((obj.fahrenheit - 32) * 5) / 9
def __set__(self, obj, celcius):
obj.fahrenheit = ((celcius * 9) / 5) + 32
class Temperature:
celcius = Celsius()
def __init__(self, fahrenheit=0):
self.fahrenheit = fahrenheit
Обратите внимание на несколько важных различий с вашим кодом:
Celcius
создан и непосредственно назначается celcius
в классе, а не атрибуту в экземпляре Temperature, как в вашем случае. Temperature
. Стандарт C ++ 98 говорит в разделе 3.6.1 параграф 2
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь возвращаемый тип type
int
, но в остальном его тип определяется реализацией. Все реализации должны допускать оба следующих определенияmain
:int main()
иint main(int argc, char* argv[])
. Таким образом, согласно стандарту, ENV, принимающий main
, не является приемлемым, но допустимым.
Поскольку это часто упоминается, здесь приведен предыдущий абзац, освобождающий автономные среды от всего, кроме документирования их поведения:
Программа должна содержать глобальную функцию, называемую main, которая является назначенное начало программы. Это реализация, определяемая, требуется ли программе в автономной среде для определения главной функции. [Примечание: в автономной среде запуск и завершение определяются реализацией; автозагрузка содержит выполнение конструкторов для объектов области пространства имен со статической длительностью хранения; Завершение содержит выполнение деструкторов для объектов со статической длительностью хранения. ]
Указатели argv
не должны быть const char* const
, потому что программе разрешено изменять буферы.
Это может не сработать, если компилятор использует преобразование имен для main
. В конце концов, это функция C ++. Следовательно, компоновщик будет искать два конкретных "искажения". Ваше определение будет иметь другое искаженное имя.
Обратите внимание, что main
является специальным (не перегружается, не вызывается) и может вообще не требовать искажения имени.
ISO / IEC 9899: TC3
Раздел 5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется главной. Реализация не объявляет прототип для этой функции. Он должен быть определен с типом возврата int и без параметров:
int main(void) { /* ... */ }
или с двумя параметрами (именуемыми здесь как argc и argv, хотя могут использоваться любые имена, так как они являются локальными для функция, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или эквивалентный; 9) или каким-либо другим образом, определяемым реализацией.
Вы должны использовать одну из стандартных подписей, чтобы соответствовать стандарту.
Я полностью понимаю, почему вы хотите поступать по-своему. Лучший способ - написать свою собственную функцию myMain () или что-то еще с нужной подписью и вызвать ее из main (), включая необходимые преобразования.
Насколько я могу судить по чтению стандарта, вы не соответствуете стандартам. Но я не могу представить себе компилятор, который бы не позволил вам это сделать. Например, компилятору потребовалось бы больше работы, чтобы запретить граничный случай, который в основном безвреден и очень неясен.
Вы можете быть незаконным по стандарту, но большинству сред выполнения это не важно. Они просто вставят целое число для argc
и указатель на argv
, вызовут ваш main
и надеются, что вы правильно их проанализируете. Итак, в вашей компетенции "гарантированная работа" является спорным вопросом, поскольку загрузчику действительно все равно, какие аргументы вы объявили.
Если он построит, будет вызван main
. Как разбирать аргументы - решать вам. Я должен уточнить, что это в значительной степени зависит от платформы, как и почти весь этот вопрос.
Тем не менее, почему?