gpt4 book ai didi

c++ - 更改类内的结构或类 |有或没有指针

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:26 25 4
gpt4 key购买 nike

在类中更改类/结构的值对我来说是个谜。我今天尝试做一些研究并提出了以下解决方案。我想知道这是否是函数更改类内部内容的正确方法。是否需要通过指针以某种方式完成此操作?有没有更合适的方法来完成这个?

#include <iostream>

int main()
{

class Someclass {
private:
int Integer;

public:

Someclass(int i):
Integer(i){} //CTOR

struct Somestruct {
int a, b;
};
Somestruct Mystruct;

void func(){
Mystruct.a = Integer/2;
Mystruct.b = Integer*2;
};
};

Someclass A(10);
A.func();
std::cout << A.Mystruct.a << " " << A.Mystruct.b << std::endl;
}

我写这段代码的原因是因为我想解析一个文件,从“Integer”行开始到一个自定义定义的结构“Mystruct”,这个类应该以某种方式提供给我。这是编写此类代码的可接受方式吗?

最佳答案

我知道你的问题是关于封装的,我们知道内部结构是一个数据持有者,外部类必须以某种方式管理它。

您设计的弱点

在您的设计中,Mystruct 是公开的。所以 Someclass 之外的任何东西都可以访问数据,但也可以更改它。这很容易出错,因为无法保证外部代码不会破坏结构的某些不变性。

改进方法

最干净的事情肯定是让一些 getter 和 setter 来访问数据。但是有 30 个成员,代码量很大。

如果您的构造过程初始化结构的数据,则第二种方法可能是将外部访问限制为只读。您可以通过将 Mystruct 设为私有(private)并提供一个返回 const 引用的函数来实现:

class Someclass {
Somestruct Mystruct;
public:
...
const Somestruct& get() { return Mystruct; }
};

std::cout << A.get().a << " " << A.get().b << std::endl;

Online demo

然而,在进入那个方向之前,我会检查是否无法封装对结构的原始数据的访问,例如通过提供无需了解内部结构即可管理数据的函数:

class Somestruct {
...
public:
ostream& show_simplified_specs(ostream& os) {
os << a << " " << b;
}
}

第三种方法可能是使用 builder design pattern基于Somestruct等部分封装一个Someclass的构造过程。

指针 ?

尽可能避免使用指针。例如,假设您有一个 Someclass vector 来将所有这些类保存在内存中。在某个时刻,您会得到一个指向元素的 Mystruct 的指针。假设您随后向 vector 中添加一个新项:所有先前的指针都可能失效。

引用也可能存在同样的风险。但我认为,虽然缓存函数返回的指针是一种常见的习惯用法,但实际上复制函数返回的引用不太常见,也不太吸引人。

关于c++ - 更改类内的结构或类 |有或没有指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com