Я не уверен, но, вероятно, этот стиль больше похож на лучшую практику
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
}
}
При игнорировании вопросов проектирования можно обойти предупреждение компилятора о неиспользуемой переменной путем исключения имени переменной, например:
virtual void OnlyImplementThisSometimes(int ) { }
По ошибке реализация неправильной сигнатуры метода при попытке переопределить виртуальную функцию является просто чем-то, относительно чего необходимо быть осторожны в C++. Языки как C# обходят это с ключевым словом 'переопределения'.
Почему определяют его в базовом классе? Если базовый класс не собирается использовать метод, то просто определяют его как виртуальный метод в Вашем производном классе.
Или реализация по умолчанию могла выдать исключение
Мы определяем макрос _unused
как:
#define _unused(x) ((void)x)
Затем определите функцию как:
virtual void OnlyImplementThisSometimes(int x) { _unused( x );}
Это не только мешает компилятору жаловаться, но и делает его очевидным для любого поддерживающего код, который Вы не забыли о x - Вы намеренно игнорируете его.
В дополнение к простому исключению имени переменной во многих компиляторах можно сказать компилятору, что Вы знаете, что это не использовано и SHUTUP путем выполнения этого
int func(int x)
{
(void) x;
}
Это не плохая практика, и это - общая идиома для определения частей класса, которые являются дополнительными для реализации.
В настоящее время я использую его для системы ввода данных пользователем, потому что это было бы утомительно для пользователя того класса для реализации каждого метода даже это, он, скорее всего, не будет использовать его так или иначе.
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) {}
};
При обеспечении реализации по умолчанию виртуальной функции это должна быть корректная реализация для всех производных классов, которые не переопределяют ту функцию. Если бы Вы не можете обеспечить корректную реализацию, то мой совет состоял бы в том, чтобы сделать чистую виртуальную функцию и оставить ее до производного класса для обеспечения реализации. Производные классы, которые не позволяют методу быть названным, могут выдать исключение, чтобы гарантировать, что он не используется по ошибке.
Это несколько распространено в моем коде. Например, у меня есть классы, которые разработаны для однопоточной операции и многопоточные. Существует много общих стандартных программ и данных. Я поместил все это в базовом классе (который имеет несколько чистые виртуальный также).
Я реализую две пустых виртуальных функции в базовом классе: Init () и Очистка (). Единственный потоковый производный класс не реализует их, но mulit-потоковый делает.
У меня есть функция фабрики, создают approprite производный класс, затем возвращают указатель. Клиентский код только знает о типе базового класса, и он называет Init () и Очистка (). Оба сценария делают правильную вещь.
Конечно, могут быть другие хорошие предложения о том, как сделать это, но эта идиома работает хорошо на большое количество моего кода.
Btw, если Вы знаете свой базовый класс, никогда нет никакой потребности сделать динамические-броски, т.е. от полученного для базирования.
Base *b = &d;
Сделает точно также, dynamic_cast<>
должен вместо этого использоваться когда Вы удрученный, т.е. от основы до полученного:
if((Derived *d = dynamic_cast<Derived *>(b)) != 0)
{
// use d
}
(И конечно в случае удрученного, static_cast<>
будет обычно работать также.)
Попробуйте это:
class Base {
virtual void OnlyImplementThisSometimes(int x) = 0;
};
Это было некоторое время, так как я сделал материал как этот, но я верю, именно так Вы объявляете виртуальную функцию.
Также как другие сказали, имена переменной являются дополнительными в объявлениях функции как это.
Самый простой ответ на это показывают ниже:
class Base {
virtual void OnlyImplementThisSometimes(int x) { x;}
};
Простая ссылка на переменную, которая абсолютно ничего не делает, удалит все предупреждения (из VC ++ на высшем уровне так или иначе).