2013-12-14 4 views
0

У меня есть этот кусок кода:Одд C++ доступа к частному вопросу член

class object 
{ 

public: 
    virtual ~object(){ } 

    bool equals(const object& J)const 
    { 
     return &J == this; 
    } 
    int operator==(const object& J)const 
    { 
     return equals(J); 
    } 
    virtual int getHash()const; 
    virtual void getType()const; 
    void* operator new(size_t size) 
    { 
     void*mem = malloc(size); 
     return mem; 
    } 
}; 

class notcopyable 
{ 
private: 
    notcopyable(const notcopyable&){} 
    notcopyable& operator=(const notcopyable&){} 
public: 
    notcopyable(){} 
}; 

class exception : 
    public object,public notcopyable 
{ 
private: 
public: 
    virtual ~exception(); 
    virtual const char* info(); 
}; 

class exception_not_implemented : 
    public exception 
{ 
public: 
    exception_not_implemented() 
    { 
    } 
    virtual const char* info() 
    { 
     return "exception_not_implemented: "; 
    } 
}; 

class exception_oob :public exception 
{ 
public: 
    exception_oob() 
    { 

    } 
    virtual const char* info() 
    { 
     return "Index out of boundary"; 
    } 
}; 

Есть две функции бросьте exception_not_implemented:

void object::getType()const 
{ 
    throw exception_not_implemented(); 
} 

int object::getHash()const 
{ 
    throw exception_not_implemented(); 
} 

И получаю эту ошибку:

error C2248: 'js::notcopyable::notcopyable' : cannot access private member declared in class 'js::notcopyable' 

выход компилятора говорит:

This diagnostic occurred in the compiler generated function 'js::exception::exception(const js::exception &)' 

Если я удалю два вышеперечисленных броска, это хорошо работает. Но такая же ошибка не возникает с exception_oob. Я не могу понять, почему.

+0

Вы уверены, что ошибка находится здесь, а не где-то еще в вашей программе? – pyon

+0

Этот код компилируется для меня. –

+0

@ EduardoLeón это может быть ... Потому что номер строки указывает на последнюю строку, показанную в моем коде. – babel92

ответ

0

Ошибка должна произойти в другом месте, где вы вызываете (закрытый) экземпляр копии.

Например:

Исключение a; Исключение b = a; // ошибка: не удается получить доступ к частному члену ...

+0

Я пробовал это, а затем я удалил его ... Ошибка все еще показывается ... – babel92

+0

@babel: Тогда некоторые из вашего другого кода непреднамеренно называют конструктор копирования. –

+0

@BenVoigt Я явно определил копию ctor и ошибка исчезла, но функция вообще не вызывается. – babel92

1

Вы можете временно добавить объявление конструктора частного экземпляра, которое будет генерировать ошибку в точке, где производится копия. Затем вы можете исправить этот код, чтобы не делать копии.

+0

Я явно определил копию ctor, и она вообще не называется ... Я пишу несколько шаблонов в том же заголовке. Это имеет значение? – babel92

+0

@ babel92: Если вы не получили ошибку, потому что она является частной, возможно, копия изгоев происходит в контексте, который имеет доступ к частным конструкторам (член или друг). Если вы объявите его без его определения, вы получите нерешенную внешнюю ошибку? –

+0

Не совсем ... Кажется, что ошибка вызвана частным доступом. И проблема связи не существует. – babel92

Смежные вопросы