У меня есть ряд кода, который подражает основной библиотеке, каталогизирующей систему. Существует базовый класс, названный объектами, в которых общий идентификатор, заголовок и переменные года определяются и 3 других производных класса (DVD, Книга и CD).
Основа [Объекты]
Полученный [DVD, Книга, CD].
Выполнения программ, однако я получаю соблюдающие предупреждения, я не уверен, как зафиксировать их.
>"C:\Program Files\gcc\bin/g++" -Os -mconsole -g -Wall -Wshadow -fno-common mainA4.cpp -o mainA4.exe In file included from mainA4.cpp:5: a4.h: In constructor `DVD::DVD(int, std::string, int, std::string)': a4.h:28: warning: `DVD::director' will be initialized after a4.h:32: warning: base `Items' a4.h:32: warning: when initialized here a4.h: In constructor `Book::Book(int, std::string, int, std::string, int)': a4.h:48: warning: `Book::numPages' will be initialized after a4.h:52: warning: base `Items' a4.h:52: warning: when initialized here a4.h: In constructor `CD::CD(int, std::string, int, std::string, int)': a4.h:66: warning: `CD::numSongs' will be initialized after a4.h:70: warning: base `Items' a4.h:70: warning: when initialized here >Exit code: 0
if (x != 33 && x != 44) {
while (x > 9) {
var parts = ('' + x).split('');
x = parseInt(parts[0]) + parseInt(parts[1]);
}
return x;
} else {
return x;
}
Работает только в том случае, если длина ввода действительно не превышает двух цифр, как вы говорите, иначе вам нужно будет сложить числа в цикле для
по частям .length
. Например: [
if (x != 33 && x != 44) {
while (x > 9) {
var parts = ('' + x).split('');
for (var x = 0, i = 0; i < parts.length; i++) {
x += parseInt(parts[i]);
}
}
return x;
} else {
return x;
}
-121–-5043494- Когда вы объявляете переменные-члены в классе, они инициализируются в том порядке, в котором вы их объявляете. Но вы можете писать их в любом порядке в списке инициализаторов вашего конструктора. Например,
struct foo {
int a;
int b;
foo(): b(5), a(3) {}
};
построит a
и , затем b
, даже если кажется, что вы инициализируете их в другом порядке.
Компилятор выдает предупреждение, потому что вы можете обманом написать неправильный код. Например,
struct foo {
int a;
int b;
foo(): b(5), a(b) {}
};
значение a
будет неопределенным.
Когда вы инициализируете члены класса в конструкторе, инициализируйте их в том же порядке, в котором они объявлены. Например: [
class Foo {
public:
int a;
int b;
Foo() : a(0), b(0) {}
};
] В конструкторе Foo ()
переключение порядка a
и b
приведет к вашим предупреждениям. То же самое касается инициализации базовых классов (конструкторы которых, если они вызываются явно, должны вызываться перед инициализаторами любых элементов данных).
Вам нужно принять взгляните на ваши конструкторы и списки инициализации членов. Трудно сказать, не видя кода, но происходит то, что у вас есть такой код: -
class my_class : public base1, public base2
{
public:
my_class();
private:
member1 member1_;
member2 member2_;
}
my_class::my_class()
: member2_(...)
, member1_(...)
, base2_(...)
, base1_(...)
{ }
Это приведет к аналогичным предупреждениям. Причина в том, что в C ++ конструктор всегда создает базовые классы в порядке, указанном в списке базовых классов (base1, за которым следует base2), а затем конструирует переменные-члены сверху вниз в определении класса. Он делает это безотносительно к порядку, который вы указываете в списке инициализации участников - этот порядок игнорируется, но если он не соответствует, некоторые компиляторы (включая ваш, похоже) предупредят вас об этом.
Причина, по которой он делает это, кстати, заключается в том, что C ++ имеет строгое требование, чтобы деструкторы вызывались в порядке, обратном конструкторам, поэтому, если бы он выполнял действия в порядке списков инициализации членов, он должен был бы каким-то образом «запомнить» какой конструктор был вызван, чтобы он мог вызывать деструкторы в правильном порядке. Он этого не делает, а просто всегда использует один и тот же порядок.