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 ~~