【问题标题】:Changing Struct or Class inside a Class | with or without pointers更改类中的结构或类 |有或没有指针
【发布时间】:2018-10-19 19:49:31
【问题描述】:

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

#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;
} 

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

【问题讨论】:

  • 我无法理解问题所在。为什么需要内部类?请举个例子。
  • 需要解析的数据非常庞大~对于 Someclass 的每个实例都包含大约 30 个不同的元素值(其中实例是通过“整数”设置的)。我不想在这个类文件中编写所有声明/定义,所以我编写了另一个包含结构定义的头文件和 cpp 文件,我将在其他地方编写解析文件的函数。只是为了让代码更具可读性。
  • “实例是通过“整数”设置的”是什么意思?
  • 我通过设置 Integer 创建了一个带有构造函数的类。解析器根据整数找到文本文件中的位置并提取大约 30 个属性。每次需要提取某些东西时,我都会使用构造函数 Integer 创建一个类,获取值,然后破坏我的类。

标签: c++ class parsing struct


【解决方案1】:

我了解您的问题是关于封装的,因为内部结构是数据持有者,而外部类必须以某种方式对其进行管理。

你的设计的弱点

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

改进方法

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

如果您的构建过程初始化结构的数据,第二种方法可能是限制外部访问为只读。您可以通过将 Mystruct 设为私有并提供一个返回 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 向量来将所有这些类保存在内存中。在某个时刻,您会得到一个指向元素Mystruct 的指针。假设您随后将一个新项添加到向量中:所有先前的指针都可能会失效。

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

【讨论】:

  • 你的理解是正确的。谢谢你的评论,我觉得这很有启发性。我将采用您提到的第二种方法,并尝试初始化所有使 Mystruct 只读的内容。再次感谢。干杯!
【解决方案2】:

这就是你要找的吗?我不太确定我理解你的意思。

template <int I>
struct Someclass;

template <>
struct Someclass<1>
{
    int Integer = 1;
    int a, b;

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

template <>
struct Someclass<2>
{
    int Integer = 2;
    int a, b, c;

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

int main()
{
    Someclass<1> A;
    A.func();
    std::cout << A.a << " " << A.b << std::endl;

    Someclass<2> B;
    B.func();
    std::cout << B.a << " " << B.b << " " << B.c << std::endl;

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多