Справка с этими предупреждениями. [наследование]

У меня есть ряд кода, который подражает основной библиотеке, каталогизирующей систему. Существует базовый класс, названный объектами, в которых общий идентификатор, заголовок и переменные года определяются и 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
5
задан Michael Petrotta 2 May 2010 в 04:44
поделиться

3 ответа

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 будет неопределенным.

28
ответ дан 18 December 2019 в 05:24
поделиться

Когда вы инициализируете члены класса в конструкторе, инициализируйте их в том же порядке, в котором они объявлены. Например: [

class Foo {
  public:
    int a;
    int b;
    Foo() : a(0), b(0) {}
};

] В конструкторе Foo () переключение порядка a и b приведет к вашим предупреждениям. То же самое касается инициализации базовых классов (конструкторы которых, если они вызываются явно, должны вызываться перед инициализаторами любых элементов данных).

3
ответ дан 18 December 2019 в 05:24
поделиться

Вам нужно принять взгляните на ваши конструкторы и списки инициализации членов. Трудно сказать, не видя кода, но происходит то, что у вас есть такой код: -

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 ++ имеет строгое требование, чтобы деструкторы вызывались в порядке, обратном конструкторам, поэтому, если бы он выполнял действия в порядке списков инициализации членов, он должен был бы каким-то образом «запомнить» какой конструктор был вызван, чтобы он мог вызывать деструкторы в правильном порядке. Он этого не делает, а просто всегда использует один и тот же порядок.

6
ответ дан 18 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

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