C++ 如何访问基类的公共数据成员?
如何访问派生类中的基类数据成员? 我想使用C++ 如何访问基类的公共数据成员?,c++,C++,如何访问派生类中的基类数据成员? 我想使用docElem数据成员,它已在子菜单列表::changeWidget()中初始化customizeCSMWindow()构造函数 classmywidget { 公众: qdomelementdocelem; QDomDocument*menuOrderXMLFile; }; 类子菜单列表:公共QListWidget、公共myWidget { Q_对象 公众时段: void changeWidget(int索引); }; 类customizeCSMwin
docElem
数据成员,它已在子菜单列表::changeWidget()
中初始化customizeCSMWindow()
构造函数
classmywidget
{
公众:
qdomelementdocelem;
QDomDocument*menuOrderXMLFile;
};
类子菜单列表:公共QListWidget、公共myWidget
{
Q_对象
公众时段:
void changeWidget(int索引);
};
类customizeCSMwindow:publicQdialog,publicMyWidget
{
Q_对象
公众:
子菜单列表*菜单列表;
定制ECSMWindow(QString);
}
customizeCSMwindow::customizeCSMwindow(QString文件名)
{
menuOrderXMLFile=新的QDomDocument();
文件=新的QFile(文件名);
QString-errorStr;
国际联络线;
int ERROR列;
如果(!menuOrderXMLFile->setContent(file,false,&errorStr,&errorLine,
&错误(列)
派生类可以访问父类的公共成员和受保护成员。
您只需使用docElem
,就好像它是子菜单列表的成员一样
继承的主要目的是使基类中的公共(和受保护)数据和函数对派生类可用,就好像这些数据和函数是在派生类本身中声明的一样
例如:
class BASE {
public:
int baseData; //the data you want to use
void workOnBaseData(){
baseData = 5;
}
};
class DERIVED : public BASE {
public:
int someData; //data member of the derived class
void workOnBaseAndSomeData(){
someData = baseData; //baseData is already known to DERIVED via inheritance
}
};
执行此代码后,您会发现someData=5!
希望这能有所帮助。类customizeCSMwindow
类似于子菜单列表类型元素的容器。容器和元素都有成员docElem
。您可以尝试在子菜单列表中访问容器customizeCSMwindow
的成员docElem
这不能直接工作。或者,为容器的元素指定一个指向容器的指针,或者在调用子菜单列表::changeWidget
中指定指向容器的指针
class myWidget
{
public :
QDomElement docElem;
QDomDocument *menuOrderXMLFile;
};
class subMenuLists : public QListWidget , public myWidget
{
Q_OBJECT
public slots:
void changeWidget( int index);
};
class customizeCSMwindow : public QDialog , public myWidget
{
Q_OBJECT
public :
subMenuLists *menuList;
customizeCSMwindow(QString);
}
customizeCSMwindow::customizeCSMwindow(QString fileName)
{
menuOrderXMLFile = new QDomDocument();
file = new QFile(fileName);
QString errorStr;
int errorLine;
int errorColumn;
if(!menuOrderXMLFile->setContent(file, false , &errorStr, &errorLine,
&errorColumn))
std::cout<<"not found \n";
else
docElem = menuOrderXMLFile->documentElement();
}
void subMenuLists::changeWidget(int index)
{
clear();
// How to access that docElem here??
}
解释元素中指向容器的指针的示例:
#包括
#包括
类myWidget
{
公众:
字符串文档;
};
类自定义ECSMWindow;
类子菜单列表:公共myWidget
{
customizeCSMwindow*m_pContainer;//指向容器的指针
公众:
子菜单列表(自定义ECSMWindow*PCContainer):
m_pContainer(pContainer)
{}
void changeWidget(int索引);
};
类customizeCSMwindow:公共myWidget
{
公众:
子菜单列表*menuList;//此指针使customizeCSMwindow成为容器。
自定义ECSMWindow();
void setMenuList(子菜单列表*ml){
menuList=ml;
}
};
customizeCSMwindow::customizeCSMwindow()//这里我们设置**容器**的docElem。
{
docElem=“自定义ECSMWindow中的docElem”;
}
void submonlists::changeWidget(int index)//在**元素**中,我们希望访问**容器的docElem**
{
//如何访问这里的文档??
std::cout什么是Q_对象
?顺便说一句-拥有公共数据成员不是一个好主意。最好有getter和setter只需使用它:docElem.doWhatever()
?允许访问docElem,但问题是我没有得到customizeCSMWindow构造函数中分配给它的docElem值。我缺少什么吗?@EdHeal请忽略Q_对象。我想解释我的问题,看看你是否能帮我。我想要的是,得到docElem的值,这是一个在子菜单列表::changeWidget()中的cusomizeCSMWidnow construtor中签名函数。到目前为止,当我在changeWidget函数中访问docElem时,它会给出null/未初始化的值。您缺少一些东西。您真正设置了什么,您访问了什么?!请看我的答案!允许访问docElem,但问题是我没有得到docElem的值,该值已在customizeCSMWind的构造函数中分配给它哦。我是不是遗漏了什么?谢谢@Tobias,我明白了。还有一件事,这个设计看起来好吗?或者你能推荐一种更好的方法让同一个变量在两个不同的类中访问,比如docElem吗?我是C++/OOPs编程的新手,所以我想知道这个“容器”的东西是不是标准的?ps:我喜欢这个方法,顺便说一句:)我有edited给出了答案。答案中的第一个示例用最简单的方式说明了问题。第二个示例说明了一种可能的实施,其中包含一些保护措施。但是,正如答案中所述。实施是否有优点或缺点也很大程度上取决于目标。谢谢@tobias。我需要阅读你提到的那些书,更好地理解第二种解决方案。不过,这个答案对你帮助很大。谢谢!