C ++将值从一个类传递到抽象类

Posted

技术标签:

【中文标题】C ++将值从一个类传递到抽象类【英文标题】:C++ Passing in a value from one class to an abstract class 【发布时间】:2016-12-24 18:09:32 【问题描述】:

假设我想创建一个测验程序。我有一个抽象类 Question 和一个名为 QuestionMC 的子类。然后我有 Class player,它将从用户那里获取播放器名称和文件名(对于 fstream)等播放器信息。我如何将信息从类播放器(文件名和播放器名)传递到类问题?

class Question

    public:
        virtual void showQuestion()=0;
    protected:
        string filename;
        string question;
        string answer;
        string questionType;
;




class Player
    
        public:
            Player(int score=0):score(score)
            void askdetails();
            string getfilename();
            string filename;
        protected:
            string fname;
            string lname;

    ;

class QuestionMC:public Question

    public:
        void showQuestion();
        void setfilename();


    protected:
        string mcQuestion;
        string mcfilename;  
;

int main()


    Player p;
    p.askdetails();
    p.getfilename();

    QuestionMC mc;
    mc.setfilename(p.filename);


void Player::askdetails()

    string filename,fname,lname;
    cout << "Please enter your First name : ";
    cin >> fname;
    cout << "Please enter your last name : " ;
    cin >> lname;
    cout << "Please enter the filename your quiz is stored : " ;
    cin >> filename;
    ifstream infile;
    infile.open(filename.c_str());

    if (infile.fail())
    
        cout << "Error Opening file, either file does not exist or invalid filename "<<endl;
        exit(1);
    

    this->fname=fname;
    this->lname=lname;
    this->filename=filename;

    ofstream outfile;
    outfile.open("Score.txt");
    outfile << "Player name and score : " << fname <<" "<< lname << " "<< score<<endl ;
    outfile.close();



string Player::getfilename()

    return filename;

void QuestionMC::setfilename(filename)

    mcfilename=filename;

【问题讨论】:

请查看The Definitive C++ Book Guide and List。 Scott Meyers 的作品特别有趣。 您可以直接访问父类的数据成员,具体取决于父变量的访问设置和继承访问。 不,我想将值从一个类(不继承)传递给另一个类 【参考方案1】:

只要类 QuestionMC 派生自类 QuestionQuestion 的所有 publicprotected 成员都继承于 QuestionMC

设置Question 类的filename 然后将其设置为QuestionMC 的成员,因此将其添加到您的

void QuestionMC::setfilename(filename)

    this->filename = filename;
    mcfilename = filename;

它有效,但有一个问题:继承的目的是什么?只要基类中的成员filename 为什么要在派生类中再次声明它??

【讨论】:

【参考方案2】:

我对此的解决方案是创建第三个类来存储指向您使用的所有内容的指针- 在您的情况下,它将存储:

指向 Player 类的指针。

指向 Question 类的指针,或者如果它是之后创建的,则指向包含所有问题指针的向量。

然后,将该类的指针作为成员添加到这两个类(Player 和 Question)中,这将使它们能够相互访问。

这个类将是一个全局变量,并且在程序结束之前永远不应该被删除(否则当试图访问其他类时它会崩溃)。

【讨论】:

以上是关于C ++将值从一个类传递到抽象类的主要内容,如果未能解决你的问题,请参考以下文章

使用列表将值从一个类传输到另一个类

将值从 Objective-C 类传递给 Swift TableViewCell

在类之间传递值

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?

如何将值从 Item Click RecyclerView 发送到另一个 java 类

Flutter:如何将值从 streamprovider / listview builder 传递给另一个类