【问题标题】:Cannot access private member declared in class 'CObject'无法访问在类“CObject”中声明的私有成员
【发布时间】:2017-04-20 12:38:36
【问题描述】:

我正在尝试为 CStringArray 创建一个复制构造函数。编译代码后,Visual Studio 给了我这个错误:无法访问在类“CObject”中声明的私有成员

在 example.h 我已经声明了变量:

list<CStringArray>EqptListPpiedsOptions;

在example.cpp中

我使用它作为我的复制构造函数:

example::example(const example &data) {
  list<CStringArray>::const_iterator itr = data.EqptListPpiedsOptions.begin();

  while (itr != data.EqptListPpiedsOptions.end()) {
    this->EqptListPpiedsOptions.push_back(*itr);
    itr++;
  }
}

如何正确使用复制构造函数 CStringArray List ?

我们将不胜感激。

【问题讨论】:

  • @Justin CStringArray 是微软 MFC 的一部分。
  • 我认为就该问题提供反馈的人了解 C++,但不了解 MFC。 CStringArray 是一种固有 类型的 MFC,而不是用户定义的类型。该类派生自CObject,因此问题不仅在于复制构造函数,还在于赋值运算符,因为.我已经在CArray 上探索了相同的问题,如stackoverflow.com/questions/32100432/… 中所述
  • 如果可以的话,我建议你根据我自己的证据使用std::vector&lt;CString&gt;stackoverflow.com/a/31755729/383779
  • @Mark Ransom。我只是使用 const_iterator 来读取列表中的数据。我没有使用它来修改数据。可以吗?
  • 抱歉,我很着急阅读手机上的代码。没毛病,继续。了解有关错误的更多详细信息会有所帮助,它在抱怨哪个成员以及哪一行产生了错误?

标签: c++ visual-c++ mfc


【解决方案1】:

如果不知道 CStringArrayEqptListPpiedsOptions 是什么,没什么可说的。但顺便说一句:

如果你在 C++11 或更高版本,你可以使用 auto 而不是繁琐地拼写类型,所以

list<CStringArray>::const_iterator itr = data.EqptListPpiedsOptions.cbegin();

变成

auto itr = data.EqptListPpiedsOptions.cbegin();

(另请注意,在 C++11 中,您使用 cbegin()cend() 表示 const_iterators。

您还可以使用 ranged-for 进一步简化:

for (const auto &itr : data.EqptListPpiedsOptions) {
  this->EqptListPpiedsOptions.push_back(itr);
}

这是一个工作示例,显示复制构造函数可以访问该类的另一个实例的私有数据成员:

#include <initializer_list>
#include <iostream>
#include <list>

class Example {
public:
  Example() = default;
  Example(std::initializer_list<int> li) : li_(li) {}
  Example(const Example &data);
  void print() {
    for (const auto i : li_) {
      std::cout << i << ", ";
    }
  }

private:
  std::list<int> li_;
};

Example::Example(const Example &data) {
  for (const auto &i : data.li_) {
    this->li_.push_back(i);
  }
}

int main() {
  Example foo{5, 4, 3, 2, 1};
  Example bar;
  bar = foo; // call copy constructor and move foo.li_ to bar.li_
  bar.print();
}

虽然在本例中,默认的复制构造函数也可以正常工作,因此无需指定新的。

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 2011-09-06
    • 1970-01-01
    • 2015-05-05
    • 2015-09-05
    • 1970-01-01
    • 2013-07-28
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多