Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问基类的公共数据成员?_C++ - Fatal编程技术网

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。我需要阅读你提到的那些书,更好地理解第二种解决方案。不过,这个答案对你帮助很大。谢谢!