如何在派生类中访问Base类数据成员?
我想使用已在docElem
中初始化customizeCSMWindow()
构造函数的subMenuLists::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??
}
如何访问docElem
函数中的void subMenuLists::changeWidget()
?
编辑:
我想解释一下我的问题,看看你是否可以帮助我。我想要的是,在docElem
函数中获取cusomizeCSMWidnow
construtor中分配的subMenuList::changeWidget()
的值。截至目前,当我在docElem
函数内访问changeWidget
时,它会给出null / uninitialized值。
答案 0 :(得分:1)
派生类可以访问父级的公共成员和受保护成员。
您只需使用docElem
,就好像它是subMenuLists
的成员一样。
答案 1 :(得分:1)
类customizeCSMwindow
类似于subMenuLists
类型元素的容器。容器和元素都有成员docElem
。您尝试访问容器subMenuLists
的{{1}}成员docElem
。
这不能直接起作用。或者,给容器的元素指定容器的指针,或者在调用customizeCSMwindow
时给指向容器的指针。
解释元素中容器指针的示例:
subMenuLists::changeWidget
在评论中你问:“还有一件事,这个设计看起来不错吗?或者你能建议任何更好的方法来获得相同的变量,即docElem可以在两个不同的类中访问吗?”
这很大程度上取决于目标。如果#include <string>
#include <iostream>
class myWidget
{
public :
std::string docElem;
};
class customizeCSMwindow;
class subMenuLists : public myWidget
{
customizeCSMwindow* m_pContainer; // Pointer to the container
public:
subMenuLists(customizeCSMwindow* pContainer) :
m_pContainer(pContainer)
{}
void changeWidget(int index);
};
class customizeCSMwindow : public myWidget
{
public:
subMenuLists *menuList; // This pointer makes customizeCSMwindow to a container.
customizeCSMwindow();
void setMenuList(subMenuLists* ml) {
menuList = ml;
}
};
customizeCSMwindow::customizeCSMwindow() // Here we set docElem of the **container**.
{
docElem = " docElem in customizeCSMwindow";
}
void subMenuLists::changeWidget(int index) // In the **element** we want to access the docElem of the **container**
{
// How to access that docElem here??
std::cout << "\nIn changeWidget:" << m_pContainer->docElem << "\n";
}
int main() {
customizeCSMwindow job;
subMenuLists menu(&job);
job.setMenuList(&menu);
menu.changeWidget(0);
}
中可以有多个元素,则应避免使用原始指针。您应该使用menuList
代替std::vector
。如果这只是某种指针实现pimpl(参见Scott Meyers有效的c ++)那么原始指针就可以了。
关于良好的实施,还有太多的话要说。您需要阅读有关该书的书籍(例如,标准书籍[Stroustrup:C ++]或[Scott Meyers:Effective C ++]或您在讨论中通过谷歌轻松找到的好参考书)。
std::shared_ptr
中只有一个可能的多个元素实现。
menuList
答案 2 :(得分:0)
继承的主要目的是使基类的公共(和受保护)数据和函数可用于派生类,就好像数据和函数是在派生类本身中声明一样。
例如:
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! 希望这有帮助。