【问题标题】:Return a CStringArray gives errors返回一个 CStringArray 给出错误
【发布时间】:2012-08-03 17:33:57
【问题描述】:

我试图返回一个 CStringArray: 在我的“.h”中,我定义了:

    Private:
    CStringArray array;

    public:
    CStringArray& GetArray();

在 . cpp 我有:

    CQueue::CQueue()
    {
    m_hApp = 0;
    m_default = NULL;
    }


    CQueue::~CQueue()
    {

     DeleteQueue();
    }

    CStringArray& CQueue::GetArray()
    {

     return array;   
    }

我试图从另一个文件中调用它:

    CStringArray LastUsedDes = cqueue.GetArray();

我猜是因为上面的行,我得到了错误:

   error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'

【问题讨论】:

  • 你确定那是产生错误的代码吗?返回对CStringArray 的引用应该可以工作,当您尝试按值返回时,通常会出现该错误。
  • @user1563551 然后请发布一个完整的、可编译的示例来重现错误。
  • @user1563551 当您没有发布代码时,谁能告诉您是否需要在构造函数中更改任何内容?除非您发布一些代码,否则无法为您提供帮助,我们可以尝试自己编译以了解发生了什么。开始从课堂中取出东西,直到它尽可能小并且仍然产生相同的错误消息。然后在此处发布类定义以及一些显示您如何使用它的代码。
  • 出于好奇,如果您将数组设置为 public,为什么不使用点运算符访问数据。大多数人会对此皱眉,但是,如果你赶时间的话。

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


【解决方案1】:

问题出在这一行

CStringArray LastUsedDes = cqueue.GetArray();

即使您在GetArray() 函数中返回对CStringArray 的引用,也会在上面的行中创建数组的副本。 CStringArray 本身没有定义拷贝构造函数,它派生自 CObject,它有一个私有拷贝构造函数。

将行改为

CStringArray& LastUsedDes = cqueue.GetArray();

但请注意,LastUsedDes 现在指的是您的类实例中包含的同一 CStringArray,对其中一个所做的任何更改都将在另一个中可见。

如果您需要返回数组的本地副本,您可以使用Append 成员函数来复制内容。

CStringArray LastUsedDes;                // default construct the array
LastUsedDes.Append( cqueue.GetArray() ); // this will copy the contents of the
                                         // returned array to the local array

【讨论】:

  • 这些微软的家伙可以通过实现类似public: CStringArray(const CStringArray& src) {Append(src);}的东西让人们的生活变得更简单
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2015-02-04
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多