2016-12-06 3 views
2

Я пытаюсь создать конструктор копирования для CStringArray. после того, как код компилируется, визуальная студия дала мне эту ошибку: Не удается получить доступ к закрытому члену, объявленный в классе «» CObjectНе удается получить доступ к закрытому члену, объявленному в классе '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?

Любая помощь будет оценена по достоинству.

+0

@ Justin 'CStringArray' является частью MFC Microsoft. –

+1

Я думаю, что люди, дающие обратную связь по вопросу, имеют knowlddge C++, но не MFC. 'CStringArray' является ** присущим ** типом MFC, а не пользователем. Класс получен из 'CObject', поэтому проблема не является единственным конструктором копирования, а также оператором присваивания, потому что. Я уже исследовал ту же проблему на 'CArray', как описано в http://stackoverflow.com/questions/32100432/how-can-i-initialize-the-default-value-of-a-carraycclass-function-parameter-w – sergiol

+0

Если вы можете, я рекомендую вам использовать 'std :: vector ' на основе моих собственных доказательств: http://stackoverflow.com/a/31755729/383779 – sergiol

ответ

-1

Нельзя сказать, не зная, что такое CStringArray или EqptListPpiedsOptions. Но так же, как в сторону:

Если вы в C++ 11land или более поздней версии, вы можете использовать auto вместо утомительного изложив типа, так

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

становится

auto itr = data.EqptListPpiedsOptions.cbegin(); 

(Обратите внимание, что в C++ 11 вы используете cbegin() и cend() для const_iterator s.

И вы можете упростить дальнейшее использование диапазона 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(); 
} 

Хотя в этом примере, конструктор копирования по умолчанию работает только также, поэтому нет необходимости указывать новую.