c++ - 将大型数组从 MainWindow 传递到 QDialogs

标签 c++ qt qt5

所以,我对 QT 相当陌生,我主要用 Java 和 Python 编写代码,而这是用 C++ 编写的。我想知道如何在没有在此对话框中设置 setFunction 的情况下传递约 200 个结构数组,并使用所述 QDialog 的实例从我的 MainWindow 调用它们。这是因为我的结构中有很多数据(大约 50 个字符串)并且复制它听起来效率低下而且很麻烦。我也不知道我是否应该把它变成一个指向结构的指针数组,如果那样的话。这是我的代码:
主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tenseselectiondialog.h"
#include <QMessageBox>
#include <iostream>

using namespace std;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);
    setWindowTitle("Japanese Conjugator 101");
    tenseSelection = new TenseSelectionDialog();
}

MainWindow::~MainWindow(){
    delete ui;
    delete tenseSelection;
    delete conjugateDialog;
}

void MainWindow::on_actionQuit_triggered(){
    QApplication::quit();
}

void MainWindow::on_actionAbout_Qt_triggered(){
    QString about = "Hey! I am the creator of this program. I want to make the process of learning japanese faster for everybody so here is a program that uses spaced repition of japanese verb conjugation to improve your conjugating skills!";
    QMessageBox::information(this, "About Me", about);
}

void MainWindow::on_actionAbout_triggered(){
    QApplication::aboutQt();
}

void MainWindow::on_startButton_clicked(){
            MainWindow::hide();
            this->tenseSelection->setModal(true);
            this->tenseSelection->exec();
            MainWindow::show();
}

void MainWindow::on_actionContact_Me_triggered()
{
    QString contact = "If you notice any errors/bugs with the program itself or conjugations, please notify me at: tomasnew1@hotmail.com, and I will send out a patch ASAP!";
    QMessageBox::information(this, "Contact Me", contact);

}

MainWindow* MainWindow::get() {
    return this;
}
紧张选择对话框.cpp
#include "tenseselectiondialog.h"
#include "ui_tenseselectiondialog.h"
#include "conjugatedialog.h"

TenseSelectionDialog::TenseSelectionDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TenseSelectionDialog)
{
    ui->setupUi(this);
    setWindowTitle("Japanese Conjugator 101");
    conjugateDialog = new ConjugateDialog();
}

TenseSelectionDialog::~TenseSelectionDialog()
{
    delete ui;
}


void TenseSelectionDialog::on_continueButton_clicked()
{
    this->conjugateDialog->setModal(true);
    this->conjugateDialog->exec();
}
结构体.h
#ifndef STRUCTS_H
#define STRUCTS_H

#include <string>
#include <string.h>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include <cassert>
#include <array>

using namespace std;

const string sampleFile = "Japanese verbs";
const string sampleExtension = ".txt";
const string samplePath = "";
const int VERBS = 500;
const int totalTenses = 14;

struct tenseType{
   string currentTense;
   string plainAffirmative;
   string plainNegative;
   string formalAffirmative;
   string formalNegative;
};

struct verbType{

    string verbStem;
    string verbInfinitive;
    string dictionaryFormRomaji;
    string dictionaryFormHiragana;
    string dictionaryFormKanji;
    string verbDefinition;
    int verbGroup;
    string verbEnding;

    tenseType presentTense;
    tenseType volitionalTense;
    tenseType imperativeTense;
    tenseType TaiTense;
    tenseType TaiPastTense;
    tenseType pastTense;
    tenseType pastPresumptiveTense;
    tenseType presentProgressiveTense;
    tenseType pastProgressiveTense;
    tenseType conditionalTaraTense;
    tenseType conditionalEbaTense;
    tenseType potentialTense;
    tenseType causativeTense;
    tenseType passiveTense;
};

void init(verbType verbArray[VERBS]);
void verbInit(verbType verbArray[VERBS], int &count, int flag, string fileName, string fileExtension = sampleExtension, string filePath = samplePath);
string removeSpaces(string str);
void printVerbs(verbType verbArray[VERBS], int count);

#endif // STRUCTS_H
函数.cpp
包括“structs.h”
void verbInit(verbType verbArray[VERBS], int &count, int flag, string fileName, string fileExtension, string filePath){
     string fileLine;
     string secondLine;
     string thirdLine;
     string fourthLine;
     string fifthLine;
     string sixthLine;
     string seventhLine;
     ifstream myFile (filePath + fileName + fileExtension);
     int currentIndex = 0;
     int passingInt = 0;
     if (myFile.is_open()){
         while (getline(myFile,fileLine)){
             verbType verb;
             verbArray[currentIndex] = verb;
             verbArray[currentIndex].verbStem = removeSpaces(fileLine);
             getline(myFile,secondLine);
             verbArray[currentIndex].verbInfinitive = removeSpaces(secondLine);
             getline(myFile,thirdLine);
             verbArray[currentIndex].dictionaryFormRomaji = removeSpaces(thirdLine);
             getline(myFile,fourthLine);
             verbArray[currentIndex].dictionaryFormHiragana = fourthLine;
             if (verbArray[currentIndex].dictionaryFormRomaji == "motsu" || verbArray[currentIndex].dictionaryFormRomaji == "matsu"){
                 verbArray[currentIndex].verbEnding = "tsu";
             }else if (verbArray[currentIndex].dictionaryFormRomaji == "arau" || verbArray[currentIndex].dictionaryFormRomaji == "tsukau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "omou" || verbArray[currentIndex].dictionaryFormRomaji == "utau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "iu" || verbArray[currentIndex].dictionaryFormRomaji == "morau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "harau" || verbArray[currentIndex].dictionaryFormRomaji == "kau" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "au" || verbArray[currentIndex].dictionaryFormRomaji == "narau"||
                       verbArray[currentIndex].dictionaryFormRomaji == "warau" || verbArray[currentIndex].dictionaryFormRomaji == "suu" ||
                       verbArray[currentIndex].dictionaryFormRomaji == "chigau"){
                 verbArray[currentIndex].verbEnding = "u";
             }else {
                 verbArray[currentIndex].verbEnding = verbArray[currentIndex].dictionaryFormRomaji.substr(verbArray[currentIndex].dictionaryFormRomaji.length()-2);
             }
             if (flag == 1) {
                 getline(myFile,fifthLine);
                 verbArray[currentIndex].dictionaryFormKanji = fifthLine;
             }
             getline(myFile,sixthLine);
             verbArray[currentIndex].verbDefinition = "to " + sixthLine;
             getline(myFile,seventhLine);
             passingInt = stoi(seventhLine);
             verbArray[currentIndex].verbGroup = passingInt;
             currentIndex++;
             count++;
        }
   }
   for (int i = 0; i < count; i++){
       if (verbArray[i].verbGroup == 1){
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "anai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           if (verbArray[i].verbEnding == "u" || verbArray[i].verbEnding == "tsu" || verbArray[i].verbEnding == "ru"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tta";
           }else if (verbArray[i].verbEnding == "bu" || verbArray[i].verbEnding == "mu" || verbArray[i].verbEnding == "nu"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "nda";
           }else if (verbArray[i].verbEnding == "ku"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ita";
           }else if (verbArray[i].verbEnding == "gu"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ida";
           }else if (verbArray[i].verbEnding == "su"){
               verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "shita";
           }
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "anakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].verbStem + "ou";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbInfinitive + "takunakatta";
           if (verbArray[i].verbEnding == "u" || verbArray[i].verbEnding == "tsu" || verbArray[i].verbEnding == "ru"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tte";
           }else if (verbArray[i].verbEnding == "bu" || verbArray[i].verbEnding == "mu" || verbArray[i].verbEnding == "nu"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "nde";
           }else if (verbArray[i].verbEnding == "ku"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ite";
           }else if (verbArray[i].verbEnding == "gu"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "ide";
           }else if (verbArray[i].verbEnding == "su"){
               verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "shite";
           }
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "anai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "e";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "emasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "emasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "eru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "enai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "eba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "anakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "imashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "ra";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "imasendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "anakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "asemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "asemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "aseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "asenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].verbStem + "aremasu";
           verbArray[i].passiveTense.formalNegative = verbArray[i].verbStem + "aremasen";
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].verbStem + "areru";
           verbArray[i].passiveTense.plainNegative = verbArray[i].verbStem + "arenai";

       }else if (verbArray[i].verbGroup == 2){
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "nai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem + "ta";
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "nakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "you";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbStem + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbStem + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbStem + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbStem + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbStem + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbStem + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbStem + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbStem + "takunakatta";
           verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem + "te kudasai";
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "nai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "ro";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "raremasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "raremasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "rareru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "rarenai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "reba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "nakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "mashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].verbStem + "tara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "masendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "nakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "sasemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "sasemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "saseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "sasenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].potentialTense.formalAffirmative;
           verbArray[i].passiveTense.formalNegative = verbArray[i].potentialTense.formalNegative;
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].potentialTense.plainAffirmative;
           verbArray[i].passiveTense.plainNegative = verbArray[i].potentialTense.plainNegative;

       }else {
           verbArray[i].presentTense.formalAffirmative = verbArray[i].verbInfinitive + "masu";
           verbArray[i].presentTense.formalNegative = verbArray[i].verbInfinitive + "masen";
           verbArray[i].presentTense.plainAffirmative = verbArray[i].dictionaryFormRomaji;
           verbArray[i].presentTense.plainNegative = verbArray[i].verbStem + "wanai";
           verbArray[i].pastTense.formalAffirmative = verbArray[i].verbInfinitive + "mashita";
           verbArray[i].pastTense.formalNegative = verbArray[i].verbInfinitive + "masendeshita";
           verbArray[i].pastTense.plainAffirmative = verbArray[i].verbStem + "tta";
           verbArray[i].pastTense.plainNegative = verbArray[i].verbStem + "wanakatta";
           verbArray[i].volitionalTense.formalAffirmative = verbArray[i].verbInfinitive + "mashou";
           verbArray[i].volitionalTense.formalNegative = verbArray[i].presentTense.plainNegative + "deshou";
           verbArray[i].volitionalTense.plainAffirmative = verbArray[i].verbStem + "ou";
           verbArray[i].volitionalTense.plainNegative = verbArray[i].presentTense.plainNegative + "darou";
           verbArray[i].TaiTense.formalAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.formalNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiTense.plainAffirmative = verbArray[i].verbInfinitive + "tai";
           verbArray[i].TaiTense.plainNegative = verbArray[i].verbInfinitive + "takunai";
           verbArray[i].TaiPastTense.formalAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.formalNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].TaiPastTense.plainAffirmative = verbArray[i].verbInfinitive + "takatta";
           verbArray[i].TaiPastTense.plainNegative = verbArray[i].verbInfinitive + "takunakatta";
           verbArray[i].imperativeTense.formalAffirmative = verbArray[i].verbStem.substr(0, verbArray[i].verbStem.length()-1) + "tte";
           verbArray[i].imperativeTense.formalNegative = verbArray[i].verbStem + "wanai de kudasai";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].verbStem + "e";
           verbArray[i].imperativeTense.plainAffirmative = verbArray[i].dictionaryFormRomaji + "na";
           verbArray[i].potentialTense.formalAffirmative = verbArray[i].verbStem + "emasu";
           verbArray[i].potentialTense.formalNegative = verbArray[i].verbStem + "emasen";
           verbArray[i].potentialTense.plainAffirmative = verbArray[i].verbStem + "eru";
           verbArray[i].potentialTense.plainNegative= verbArray[i].verbStem + "enai";
           verbArray[i].presentProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imasu";
           verbArray[i].presentProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "iru";
           verbArray[i].presentProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasen";
           verbArray[i].presentProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastProgressiveTense.formalAffirmative = verbArray[i].imperativeTense.formalAffirmative + "imashita";
           verbArray[i].pastProgressiveTense.plainAffirmative = verbArray[i].imperativeTense.formalAffirmative + "ita";
           verbArray[i].pastProgressiveTense.formalNegative = verbArray[i].imperativeTense.formalAffirmative + "imasendeshita";
           verbArray[i].pastProgressiveTense.plainNegative = "N/A";
           verbArray[i].pastPresumptiveTense.formalAffirmative = verbArray[i].pastTense.plainAffirmative + "deshou";
           verbArray[i].pastPresumptiveTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "rou";
           verbArray[i].pastPresumptiveTense.formalNegative = verbArray[i].pastTense.plainNegative + "deshou";
           verbArray[i].pastPresumptiveTense.plainNegative = verbArray[i].pastTense.plainNegative + "darou";
           verbArray[i].conditionalEbaTense.plainAffirmative = verbArray[i].verbStem + "eba";
           verbArray[i].conditionalEbaTense.plainNegative = verbArray[i].verbStem + "wanakereba";
           verbArray[i].conditionalEbaTense.formalAffirmative = "N/A";
           verbArray[i].conditionalEbaTense.formalNegative = "N/A";
           verbArray[i].conditionalTaraTense.formalAffirmative = verbArray[i].verbStem + "imashitara";
           verbArray[i].conditionalTaraTense.plainAffirmative = verbArray[i].pastTense.plainAffirmative + "ra";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "imasendeshitara";
           verbArray[i].conditionalTaraTense.formalNegative = verbArray[i].verbStem + "wanakattara";
           verbArray[i].causativeTense.formalAffirmative = verbArray[i].verbStem + "wasemasu";
           verbArray[i].causativeTense.formalNegative = verbArray[i].verbStem + "wasemasen";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "waseru";
           verbArray[i].causativeTense.plainAffirmative = verbArray[i].verbStem + "wasenai";
           verbArray[i].passiveTense.formalAffirmative = verbArray[i].verbStem + "waremasu";
           verbArray[i].passiveTense.formalNegative = verbArray[i].verbStem + "waremasen";
           verbArray[i].passiveTense.plainAffirmative = verbArray[i].verbStem + "wareru";
           verbArray[i].passiveTense.plainNegative = verbArray[i].verbStem + "warenai";
       }
   }
}

void printVerbs(verbType verbArray[VERBS], int count){
    for (int i = 0; i < count; i++){
        cout << "Verb Ending: " << setw(20) << verbArray[i].verbEnding << endl;
        cout << "Verb Form Pres " << setw(20) << verbArray[i].presentTense.formalAffirmative << setw(30) << verbArray[i].presentTense.formalNegative << endl;
        cout << "Verb Plain Pres " << setw(20) <<  verbArray[i].presentTense.plainAffirmative << setw(30) << verbArray[i].presentTense.plainNegative << endl;
        cout << "Verb Form Past " << setw(20) << verbArray[i].pastTense.formalAffirmative << setw(30) << verbArray[i].pastTense.formalNegative << endl;
        cout << "Verb Plain Past " << setw(20) << verbArray[i].pastTense.plainAffirmative << setw(30) << verbArray[i].pastTense.plainNegative << endl;

    }
}

string removeSpaces(string str)  {
    string placer = "";
    for (int i = 0; i < str.length(); i++){
        if (!isspace(str[i])){
            placer += str[i];
        }
    }
    return placer;
}
我没有包含我的 .h 文件,因为我没有足够的行,只知道我的数组是私有(private)成员。感谢您的帮助!

最佳答案

1a。有效地传递数组

my struct has a lot of data within it (around 50 strings) and copying it over sounds inefficient and a hassle.

...

void printVerbs(verbType verbArray[VERBS], int count);



首先,开始使用 C++ 容器,如 std::vectorQVector而不是原始的 C 数组。 C++ 容器类更易于管理和调试。

然后,您可以通过 廉价地传递数组。常量引用 :
void printVerbs(const QVector<verbType> &verbArray);
注意:您不需要通过count ! vector 知道它包含多少个元素。

这实现了两件事:
  • 引用 part 确保在函数调用期间不会复制您的数据,因为该函数正在引用已存在的数据
  • 常量 部分确保该函数不会意外修改您现有的数据。

  • 1b。复制数组而不复制
    QVector是隐式共享的(也称为“写时复制”):https://doc.qt.io/qt-5/implicit-sharing.html这意味着您可以传递 QVector<verbType> 的拷贝来自您的MainWindow进入您的TenseSelectionDialog甚至将拷贝作为成员变量存储在 TenseSelectionDialog 中.只要两个拷贝都没有被修改,两个 vector 将在内部共享相同的数据。

    或者,如果您保证 MainWindow将永远活得更久TenseSelectionDialog , 那么你可以有 TenseSelectionDialog存储指向 MainWindow 的指针或引用的成员变量。

    2.使用arrays-of-(pointers-to-structs)

    I also don't know whether I should make it an array of pointers to structs if that'd be the way to go.



    在以下情况下使用指针数组最有用:
  • 您的数组将被频繁修改或复制。
  • 插入或删除元素会导致数组内容在内存中移动。
  • 移动/复制指针比大型结构更便宜。
  • 您的阵列将是巨大的。
  • 数组中的数据存储在一个连续的内存块中,由 N * sizeof<ArrayElement> 给出在哪里 N是元素的数量。
  • 如果您的内存过于碎片化,您的 PC 可能没有足够大的连续 RAM block 来存储数据。
  • 对于大型结构,存储指针会减少所需的连续内存量。

  • 如果这两个标准不适用,那么使用指针数组的好处就更少了。 (提示:~500 个元素很小)

    如果要使用指针数组,请使用 std::shared_ptr而不是原始指针,这样您就不需要显式地管理内存。

    3.(其他)字符串编程

    如果您愿意使用 QString在您的核心逻辑中,您的字符串操作代码可以大大简化。

    例子:

    string removeSpaces(string str)  {
        string placer = "";
        for (int i = 0; i < str.length(); i++){
            if (!isspace(str[i])){
                placer += str[i];
            }
        }
        return placer;
    }
    


    ...可以替换为
    QString removeSpaces(QString str) {
        str.remove( QRegularExpression("\s") );
        return str;
    }
    

    ...或者您可以调用QString::trimmed()如果您只想从字符串的末尾删除空格。
    QString也是 unicode 感知的(不像 std::string ),所以你可以用它以独立于平台的方式存储平假名、片假名和日本汉字。

    关于c++ - 将大型数组从 MainWindow 传递到 QDialogs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552259/

    相关文章:

    c++ - Qt:通过点符号从 QML 访问 C++ 对象

    video - 没有可用于类型 'video/x-h264 的解码器

    html - html 字体大小在 QMessageBox 的信息文本中不起作用吗?

    c++ - 从 C++ 应用程序到 Akka actor 的推荐方式

    c++ - WriteFile 之后的 ReadFile 到调制解调器仅返回通过 WriteFile 发送的内容

    c++ - 当分配静态指针时,如何使自动完成器识别自动类型变量?

    c++ - 在 QList 中添加一个 QVector

    c++ - 如何捕获 QSystemTrayIcon 退出事件?

    c++ - 如何在 Windows 上清理命名管道?

    c++ - 在QT C++中安装MQTT时出错QAbstractSocket