Como C++ implementa o compartilhamento de dados entre várias classes

fundo:

No último semestre do ensino fundamental, fiz o design do curso C ++ e o tópico era [Sistema de entrada de notas do aluno] (a interface de várias janelas do QT foi usada).

Como as informações dos alunos precisam ser compartilhadas entre várias janelas, é necessário concluir a função de compartilhar os mesmos dados entre várias turmas.

método:

Basta usar o seguinte código diretamente:

Arquivo de cabeçalho datashare.h:

#ifndef DATASHARE_H
#define DATASHARE_H

#include "grade.h"  // 需要共享的数据(在这里是“Grade”类的一个对象)的头文件定义

class DataShare {
protected:  // 禁止类外访问,但允许子类访问
    DataShare();  // 构造函数,初始化要共享的数据
    Grade& grade = sharedData();  // 定义要共享数据的引用(可被修改)
private:  // 禁止类外和子类访问
    static Grade& sharedData();  // 返回要共享数据的引用(可被修改)
};

#endif // DATASHARE_H

Arquivo de implementação datashare.cpp:

#include "datashare.h"


DataShare::DataShare() {  // 初始化要共享的数据,这部分因人而异
    this->sharedData() = Grade();  // 一定要赋值给 “this->sharedData()”
    this->sharedData().loadJsonFile(":/grade.json");
}

Grade& DataShare::sharedData() {  // 返回要共享数据的引用(可被修改)
    static Grade dataShare;  // 这里是真正要共享的数据本体
    return dataShare;
}

ilustrar:

① No código acima, datashare é o dado que precisa ser compartilhado (datashare é uma instância da classe Grade, que armazena os dados de toda a nota), esta parte precisa ser modificada para a instância que você deseja compartilhar, ou pode ser qualquer outro tipo de dado.

② O objeto/dado que você precisa compartilhar deve ser inicializado no construtor.

③ Método de compartilhamento: Se você precisar compartilhar notas de dados entre as classes A, B e C, você só precisa herdar da classe DataShare ao mesmo tempo para as classes A, B e C, e então você pode usar diretamente os membros da classe DataShare nas classes A, B e C (assim como seus próprios membros)

Exemplo:

Agora existem 4 janelas que precisam compartilhar os dados de toda a nota (armazenados no objeto de nota, e o objeto de nota é armazenado na classe DataShare), então você só precisa herdar da classe DataShare da seguinte forma:

class AddWindow : public QWidget, protected DataShare
class MainWindow : public QMainWindow, protected DataShare
class ManageWindow : public QWidget, protected DataShare
class StatWindow : public QWidget, protected DataShare

Entre eles, " DataShare protegido " é um código recém-adicionado.

princípio:

Definir um membro estático em uma classe pode, é claro, obter compartilhamento de dados, mas membros estáticos de C++ devem ser atribuídos fora da classe e todas as classes podem ser acessadas diretamente por meio do nome da classe (não pode ser usado como um membro privado. Isso quebra a proteção de encapsulamento de membros da classe e deve ser acessado de uma forma como "DataShare::grade", que é muito deselegante). Depois de pensar sobre isso, finalmente encontrei um método muito inteligente (veja o código):

Os dados reais são armazenados na variável estática static Grade dataShare na função de membro sharedData da classe DataShare . Fazer isso ignora a desvantagem de que os membros estáticos devem ser inicializados fora da classe.

Quando o construtor DataShare::DataShare() é executado, a seguinte instrução será executada: this->sharedData() = Grade();  O objeto Grade recém-criado é atribuído à função sharedData (o quê? A função também pode ser atribuída?). A razão pela qual pode ser atribuído é que sharedData é definido como uma função cujo valor de retorno é uma referência . Desta forma, this->sharedData() = Grade() é equivalente à variável estática dataShare da função sharedData que está sendo atribuída . Como os dados que se espera que sejam compartilhados são grade , sharedData é definido como uma função privada, impedindo que as subclasses tenham acesso.

Vejamos Grade& grade = sharedData();  grade é definida como uma variável membro de tipo protegido, que garante o encapsulamento de dados e pode ser herdada por subclasses. No uso real, você pode atribuir diretamente a nota ou chamar nota . Motivo: a variável de membro da nota é uma referência ao valor de retorno da função estática sharedData e o valor de retorno de sharedData é uma referência à variável estática dataShare da função sharedData . Dessa forma, quando acessamos diretamente a variável de membro de grau, ela pode ser considerada diretamente como uma referência a uma variável estática em uma função estática da classe, e todos sabemos que a variável estática da função é armazenada na área de armazenamento estático. E porque a função é uma função estática e a variável é uma variável estática, os dados reais serão armazenados apenas em todo o programa e apenas uma cópia será armazenada. Dessa forma, não importa quantas classes herdem do DataShare , elas compartilharão apenas uma parte da nota (dados) e, como o membro protegido Grade& grade = sharedData() é herdado , eles podem usar diretamente a variável de membro da nota em sua própria classe . Por meio desse método, o compartilhamento preciso de dados entre diferentes classes pode ser realizado.

Até agora, este tutorial sobre como implementar o compartilhamento de dados entre várias classes em C++ acabou. Se você ainda tiver dúvidas, deixe uma mensagem na área de comentários ou mensagem privada na pequena janela ~~

Acho que você gosta

Origin blog.csdn.net/ik666/article/details/131929268
Recomendado
Clasificación