Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++_Class_Object_Vector - Fatal编程技术网

C++ 从其他类访问向量对象

C++ 从其他类访问向量对象,c++,class,object,vector,C++,Class,Object,Vector,我创建了一个带有指针的向量,并在一个名为 BOOL Cbeckhoff_frontendDlg::OnInitDialog() { //... std::vector<Modul*> arrDigOut; arrDigOut.push_back(new DigOut(IDC_CHECK1, this,"GVL.DigOut1",pAddr)); //... for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->InitC

我创建了一个带有指针的向量,并在一个名为

BOOL Cbeckhoff_frontendDlg::OnInitDialog()
{
//...
std::vector<Modul*> arrDigOut;
arrDigOut.push_back(new DigOut(IDC_CHECK1, this,"GVL.DigOut1",pAddr));
//...
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->InitCheck(this);
//...
}
BOOL Cbeckhoff_frontendDlg::OnInitDialog()
{
//...
std::向量arrDigOut;
arrDigOut.push_back(新的DigOut(IDC_CHECK1,这是“GVL.DigOut1”,pAddr));
//...
for(iNumDO=0;iNumDOInitCheck(this);
//...
}
如何从以下不同方法访问向量:

void Cbeckhoff_frontendDlg::OnBnClickedButton3()
{
for(iNumDO = 0;iNumDO<1;iNumDO++) arrDigOut[iNumDO]->SetID();
}
void Cbeckhoff_frontendDlg::onbnCClickedButton3()
{
for(iNumDO=0;iNumDOSetID();
}
我曾考虑过使用公共指针或setter和getter,
但我不能像这样创建MemberVariable:

std::vector<Modul*> *   parrDigOut;
std::vector*parrDigOut;

在它抱怨的地方,Modul没有声明。

如果我理解正确,只需将其公开,并在其前面添加以下行:

class Modul;

您的示例给人的印象是您正在函数范围中声明
向量
。它的生命周期在函数调用结束时结束(并且所有内存都泄漏)。将其存储为类成员和成员函数
begin
end
,这些函数转发到
vector
begin
end
成员函数。可能将它们包装在
解引用迭代器中,以隐藏它们是指针的事实

class foo {
public:
  foo() { 
    // add things to s_
  }

  ~foo() { 
    // dont forget to delete everything in s_
  }
  typedef std::vector<my_stuff*>::iterator iterator;
  typedef std::vector<my_stuff*>::const_iterator const_iterator;
  iterator begin() { return s_.begin(); }
  iterator end() { return s_.end(); }
  const_iterator begin() const { return s_.begin(); }
  const_iterator end() const { return s_.end(); }

  // or to hide the pointers
  typedef boost::indirect_iterator< std::vector<my_stuff*>::iterator > iterator;
  iterator begin() { return boost::make_indirect_iterator(s_.begin()); }
  iterator end() { return boost::make_indirect_iterator(s_.end()); }
private:
  std::vector<my_stuff*> s_;
};
class-foo{
公众:
foo(){
//添加内容到_
}
~foo(){
//别忘了删除s中的所有内容_
}
typedef std::vector::迭代器迭代器;
typedef std::vector::const_迭代器const_迭代器;
迭代器begin()
迭代器end(){return s_.end();}
常量迭代器begin()常量{返回s_u.begin();}
常量迭代器end()常量{返回s_u.end();}
//或者隐藏指针
typedef boost::间接迭代器iterator;
迭代器begin(){return boost::make_indirect_迭代器(s_u.begin());}
迭代器end(){return boost::make_indirect_迭代器(s_u.end());}
私人:
std::向量s;
};

您可以按照说明定义成员变量。 在类声明之上,只需提供一个转发声明

class Modul;
这是为了让编译器知道这样一个类将在某个地方被定义

成员变量不必是公共的,因为它是从同一类中的另一个函数访问的

只需宣布该成员为:

std::vector<Modul*>   parrDigOut; //No need of pointers
std::vector parrDigOut;//不需要指针
但是,您可以考虑使用智能指针来确保在父类超出范围时将其删除