如何设置类的内部结构

how to set internals of a class

本文关键字:内部 结构 设置 何设置      更新时间:2023-10-16
嗨,我对C++很

陌生,并且正在将 C 代码转换为 C++。我首先将所有结构转换为类,并为内部添加了访问器和突变器,但有些结构内部还有其他结构。我想知道在类中设置类内部的最佳方法,例如 结构1.结构2.结构3.i = 5;我应该使用访问器作为引用传递吗?但是看到访问器往往是常量,这是我应该做的事情吗?

类似的东西class1.get_class2().get_class3().set_i(5) 或者其他东西,如果它可以以这种格式完成。

这可能是一个愚蠢的问题,但我不知道该怎么做,谢谢

 class1.get_class2().get_class3().set_i(5)

如果 get_class2() 是非const并返回非const指针引用,则可能。

但是,这种方法完全打破了封装。class1的用户不应该(也不应该)知道class1内部使用class2,而内部又使用class3

如果 setter-API 是绝对必要的,那么更好的方法是分层执行。例如

// User
class1.set_i( 5 );
// class1
class1::set_i( int x ) { class2_obj.set_i( x ); }
// class2
class2::set_i( int x ) { class3_obj.set_i( x ); }
// class3
class3::set_i( int x ) { i_ = x; }

我不太确定...您是将类放在类中还是将对象放在类中?

像这样:

class OBJ1
        {
          //methods , and other stuff
           }
class OBJ2
        {
          public OBJ1 *O ;
           }

是有效的,所以你可以访问一个方法,如:

OBJ2 *N2 ;
N2->O->some_method();

然而,类似的东西

class OBJ2
{
     class OBJ1;
 }

无效:P

再。。。不确定这是否正是您问的...

如果您确实有充分的理由通过 getter 和 setter 访问您的成员对象,您可以执行以下操作:

class A {
public:
    void f() const {}
};
class B {
public:
    const A &get_a() const {
        // the returned reference will be read-only, i.e. only non-const member
        // functions can be called, and public members can not be written.
        // it needs to be stored in a const A & object.
        return a;
    }
    A &get_writable_a() {
        return a;
    }
    void set_a(A &a) {
        //make sure that the assignment operator of A will take care of all the
        //dirty internals, such as internal buffers that need to be deleted.
        this->a = a;
    }
private:
    //the member
    A a;
};
int main() {
    B b;
    b.get_a().f();
}

如果您没有充分的理由这样做,我建议您简单地将其设为公共成员,并直接访问它:

class A {
public:
    void f() const {}
};
class B {
public:
    A a;
};
int main() {
    B b;
    b.a.f();
}

这不就是更优雅吗?

请注意,您可以使用friend指定允许直接访问私有成员的其他函数或类。

正如在另一个答案中也指出的那样,在大多数情况下,使成员对象对外部可见是一个坏主意。