0

我是 C++ 编程的初学者,我想知道如何使用 cin 将结构作为参数传递给函数。

代码的想法是从用户输入结构的名称,并将该名称传递给函数。这是我一直在玩的东西:

   class myPrintSpool
    {
    public:
        myPrintSpool();
        void addToPrintSpool(struct file1);
    private:
        int printSpoolSize();
        myPrintSpool *printSpoolHead;
    };

    struct file1
   {
        string fileName;
        int filePriority;
        file1* next;

   };

    int main()
    {
        myPrintSpool myPrintSpool; 
        myPrintSpool.addToPrintSpool(file1);
    return 0; 
    } 

这是能够建造的。但是,我想要更多的东西:

 class myPrintSpool
    {
    public:
        myPrintSpool();
        void addToPrintSpool(struct fileName);
    private:
        int printSpoolSize();
        myPrintSpool *printSpoolHead;
    };

    struct file1
   {
        string fileName;
        int filePriority;
        file1* next;

   };

    int main()
    {
        string fileName; 
        cout << "What is the name of the file you would like to add to the linked list?"; 
        cin >> fileName; 

        myPrintSpool myPrintSpool; 
        myPrintSpool.addToPrintSpool(fileName);
    return 0; 
    } 

任何人都可以帮助我如何去做吗?提前致谢!

4

1 回答 1

0

一般来说,这种元编程在 C++ 中是非常先进的。原因是,与解释语言不同,源文件中存在的大部分内容在文件编译时都会丢失。在可执行文件中,字符串file1可能根本不显示!(我相信它取决于实现)。

相反,我建议进行某种查找。例如,您可以将在 fileName 中传入的字符串与每个结构的 进行比较fileName,或者,您可以将任何键与您的结构相关联。例如,如果您创建了 astd::map<string, baseStruct*>并从 继承了所有结构(例如 file1、file2、...)baseStruct,那么您可以在映射中查找与传入字符串关联的结构。继承很重要,因为您需要多态性才能将不同类型的结构插入到映射中。

我们可以讨论许多其他更高级的主题,但这是总体思路。进行某种查找而不是尝试在运行时从字符串实例化类型是最简单的。是一种更严格、更易于维护的方法来做基本相同的事情。

编辑:如果你的意思是你只有一种名为'file1'的结构并且你想实例化它并将它传递给addToPrintSpool,这与我之前的答案不同(例如,如果你想要多个名为file1的结构和 file2 并想推断要使用哪个结构。从字符串中动态找出类型很难,但在已知类型的实例中设置字符串很简单。)

要实例化和使用您的实例,file1可以这样做:

//In myPrintSpool, use this method signature.
//You are passing in an object of type file1 named aFile;
//note that this object is _copied_ from someFile in your
//main function to a variable called aFile here.
void addToPrintSpool(file1 aFile);
...
int main()
{
    string fileName; 
    cout << "What is the name of the file you would like to add to the linked list?"; 
    cin >> fileName; 

    //Instantiate a file1 object named someFile, which has all default fields.
    file1 someFile;
    //Set the filename of aFile to be the name you read into the (local) fileName var.
    someFile.fileName = fileName;

    myPrintSpool myPrintSpool; 
    //Pass someFile by value into addToPrintSpool
    myPrintSpool.addToPrintSpool(someFile);
    return 0; 
} 
于 2013-01-16T00:58:51.753 回答