2017-09-13 90 views
0

在以下给出,访问乙我们可以用类B的成员函数和返回数据成员的私人数据成员,赋值给的数据成员的代码在构造函数(转换函数)内。但我无法这样做。请建议一些帮助。其他方式可以使B的A类朋友,但需要通过构造函数访问。访问私有数据成员

#include <iostream> 
using namespace std; 
class B 
{ 
    int i_; 
    public: 
     B(int i = 3) : i_(i) {} 
     int give() { return i_; } 
}; 
class A 
{ 
    int i_; 
    public: 
     A(int i = 0) : i_(i) { cout << "A::A(i)\n"; } 
     A(const B &b1) : i_(b1.i_) {} // Type casting using constructor 
     int display() { cout << i_; } 
}; 
int main() 
{ 
    A a; 
    B b; // object is constructed 
    a = static_cast<A>(b); // B::operator A(), converting data member of class B to class A 
    a.display(); 
    return 0; 
} 

回答

1

这是不够的,关注@说书人的建议,你也需要改变A的构造函数中使用正确的“吸气”的方法,让你停止访问私有成员:

A(const B &b1) : i_(b1.give()) {}

1

您的问题是const正确性。 int give()是一个非const成员函数,它只能在非const对象上调用。但const B &b1是对const对象的引用。

既然你不修改返回整数的值时B对象,使你的代码const正确性以const资格的成员函数:

int give() const { return i_; } 

而现在的A c'tor不试图进行非法操作。

+0

感谢有用的信息。问题仍然是: prog.cpp:在构造函数 'A :: A(常数B&)': prog.cpp:18:32:错误:INT B :: I_'是私人此上下文 A内(常量B&B1):I_(b1.i_){} //使用构造 ^〜 prog.cpp类型铸造:6:9:注:声明为专用这里 INT I_; ^〜我想知道如何在没有朋友声明的情况下访问B的i_。 – KnitahK

+0

@KnitahK - 这不是论坛或调试服务。我用明显的代码指出了问题。如果您有*特定*问题,请发布[mcve]。 – StoryTeller

+1

@KnitahK - 这个错误表明你没有使用'get()'。那么你的代码在这个问题上与错误有什么关系? – StoryTeller