sil*_*ent 5 c++ inheritance warnings class gcc-warning
我有一组代码,它模仿基本的图书馆编目系统.有一个名为items的基类,其中定义了通用id,title和year变量以及3个其他派生类(DVD,Book和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
Jes*_*der 28
在类中声明成员变量时,它们将按您声明的顺序初始化.但是您可以在构造函数的初始化列表中以任何顺序编写它们.例如,
struct foo {
int a;
int b;
foo(): b(5), a(3) {}
};
Run Code Online (Sandbox Code Playgroud)
将建设a和然后 b,即使它看起来你初始化他们在其他命令.
编译器会发出警告,因为您可以欺骗自己编写错误的代码.例如,
struct foo {
int a;
int b;
foo(): b(5), a(b) {}
};
Run Code Online (Sandbox Code Playgroud)
价值a将是未定义的.
您需要查看构造函数和成员初始化列表.在没有看到代码的情况下告诉是很棘手的,但是发生的事情是你有这样的代码: -
class my_class : public base1, public base2
{
public:
my_class();
private:
member1 member1_;
member2 member2_;
}
my_class::my_class()
: member2_(...)
, member1_(...)
, base2_(...)
, base1_(...)
{ }
Run Code Online (Sandbox Code Playgroud)
这将产生类似的警告.原因是在C++中构造函数总是按照基类列表中显示的顺序构造基类(base1后跟base2),然后它在类定义中从上到下构造成员变量.它会在不考虑您在成员初始化列表中指定内容的顺序执行此操作 - 此顺序将被忽略,但如果它与某些编译器(包括您的编译器)不匹配,则会向您发出警告.
这样做的原因是C++有一个严格的要求,即以构造函数的相反顺序调用析构函数,所以如果它按成员初始化列表的顺序执行,它将不得不以某种方式"记住"哪个构造函数具有被调用,以便它可以按正确的顺序调用析构函数.它不会这样做,而只是总是使用相同的顺序.
| 归档时间: |
|
| 查看次数: |
7937 次 |
| 最近记录: |