2013-01-16 4 views
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; 
    } 

Может ли кто-нибудь помочь, как бы я это сделал? Заранее спасибо!

ответ

0

Этот вид метапрограммирования, в общем, чрезвычайно продвинутый в C++. Причина в том, что в отличие от интерпретируемых языков большая часть того, что существует в исходном файле , теряется при компиляции файла. В исполняемом файле строка file1 может вообще не отображаться! (полагаю, это зависит от реализации).

Вместо этого я бы рекомендовал сделать какой-то поиск. Например, вы можете сравнить строку, переданную в fileName, с каждой строкой fileName, или вы можете просто связать любой ключ с вашей структурой. Например, если вы создали и унаследовали все ваши структуры (например, file1, file2, ...) от baseStruct, то вы можете искать на карте, какая структура связана с переданной в строке. Наследование важно, потому что вам понадобится полиморфизм для вставки структур разных типов в карту.

Есть много других, более продвинутых тем, на которые мы могли бы попасть, но это общая идея. Наиболее просто сделать какой-то поиск, а не пытаться создать экземпляр типа во время выполнения из строки. Here - более строгий и более удобный подход к тому, чтобы делать в основном то же самое.

EDIT: Если вы имеете в виду, что у вас есть только один тип структуры, называемый '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; 
} 
+0

Благодарим за помощь :) –

Смежные вопросы