将Struct作为参数传递给函数

时间:2013-01-16 00:53:49

标签: function pointers parameters struct arguments

我是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; 
    } 

任何人都可以帮我解决这个问题吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

我们可以进入许多其他更高级的主题,但这是一般性的想法。进行某种查找最简单,而不是尝试从字符串中在运行时实例化类型。 Here是一种更严格,更易于维护的方法,基本上可以做同样的事情。

编辑:如果你的意思是你只有一种类型的结构叫做'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; 
}