我是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 :(得分: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;
}