Являются нечистые виртуальные функции с параметрами плохой практикой?

Я не уверен, но, вероятно, этот стиль больше похож на лучшую практику

type Course {
  id: Int
  title: String
  author: String
  from: String
  to: String
  description: String
  topic: String
  url: String
}

input DateInput {
  dateFrom: String!
  dateTo: String!
}

type Query {
  courseWithDate(input: DateInput!, name: String!): Course
}

И запрос на стороне клиента должен быть:

  {
    courseWithDate(input: {
      dateFrom: "${dateFrom}"
      dateTo: "${dateTo}"
    }
    name: "${name}") 
    {
      id
      name
    }
  }
9
задан Matthew Smith 3 November 2008 в 23:56
поделиться

10 ответов

При игнорировании вопросов проектирования можно обойти предупреждение компилятора о неиспользуемой переменной путем исключения имени переменной, например:

virtual void OnlyImplementThisSometimes(int ) { }

По ошибке реализация неправильной сигнатуры метода при попытке переопределить виртуальную функцию является просто чем-то, относительно чего необходимо быть осторожны в C++. Языки как C# обходят это с ключевым словом 'переопределения'.

22
ответ дан 4 December 2019 в 06:03
поделиться

Почему определяют его в базовом классе? Если базовый класс не собирается использовать метод, то просто определяют его как виртуальный метод в Вашем производном классе.

Или реализация по умолчанию могла выдать исключение

6
ответ дан 4 December 2019 в 06:03
поделиться

Мы определяем макрос _unused как:

#define _unused(x) ((void)x)

Затем определите функцию как:

virtual void OnlyImplementThisSometimes(int x) { _unused( x );}

Это не только мешает компилятору жаловаться, но и делает его очевидным для любого поддерживающего код, который Вы не забыли о x - Вы намеренно игнорируете его.

11
ответ дан 4 December 2019 в 06:03
поделиться

В дополнение к простому исключению имени переменной во многих компиляторах можно сказать компилятору, что Вы знаете, что это не использовано и SHUTUP путем выполнения этого

int func(int x)
{
   (void) x;
}
3
ответ дан 4 December 2019 в 06:03
поделиться

Это не плохая практика, и это - общая идиома для определения частей класса, которые являются дополнительными для реализации.

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

class mouse_listener{
public:
    virtual ~mouse_listener() {}

    virtual void button_down(mouse_button a_Button) {}
    virtual void button_up(mouse_button a_Button) {}
    virtual void scroll_wheel(mouse_scroll a_Scroll) {}
    virtual void mouse_move_abs(math::point a_Position) {}
    virtual void mouse_move_rel(math::point a_Position) {}
};
2
ответ дан 4 December 2019 в 06:03
поделиться

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

4
ответ дан 4 December 2019 в 06:03
поделиться

Это несколько распространено в моем коде. Например, у меня есть классы, которые разработаны для однопоточной операции и многопоточные. Существует много общих стандартных программ и данных. Я поместил все это в базовом классе (который имеет несколько чистые виртуальный также).

Я реализую две пустых виртуальных функции в базовом классе: Init () и Очистка (). Единственный потоковый производный класс не реализует их, но mulit-потоковый делает.

У меня есть функция фабрики, создают approprite производный класс, затем возвращают указатель. Клиентский код только знает о типе базового класса, и он называет Init () и Очистка (). Оба сценария делают правильную вещь.

Конечно, могут быть другие хорошие предложения о том, как сделать это, но эта идиома работает хорошо на большое количество моего кода.

2
ответ дан 4 December 2019 в 06:03
поделиться

Btw, если Вы знаете свой базовый класс, никогда нет никакой потребности сделать динамические-броски, т.е. от полученного для базирования.

Base *b = &d;

Сделает точно также, dynamic_cast<> должен вместо этого использоваться когда Вы удрученный, т.е. от основы до полученного:

if((Derived *d = dynamic_cast<Derived *>(b)) != 0)
{
  // use d
}

(И конечно в случае удрученного, static_cast<> будет обычно работать также.)

2
ответ дан 4 December 2019 в 06:03
поделиться

Попробуйте это:

class Base {
    virtual void OnlyImplementThisSometimes(int x) = 0;
};

Это было некоторое время, так как я сделал материал как этот, но я верю, именно так Вы объявляете виртуальную функцию.

Также как другие сказали, имена переменной являются дополнительными в объявлениях функции как это.

-1
ответ дан 4 December 2019 в 06:03
поделиться

Самый простой ответ на это показывают ниже:

class Base {
    virtual void OnlyImplementThisSometimes(int x) { x;}
};

Простая ссылка на переменную, которая абсолютно ничего не делает, удалит все предупреждения (из VC ++ на высшем уровне так или иначе).

-2
ответ дан 4 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

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