gpt4 book ai didi

c++ - 如何允许用户确定模板类型?

转载 作者:行者123 更新时间:2023-11-30 04:48:45 25 4
gpt4 key购买 nike

我编写了一个基于其数据类型模板化的工作链接队列,但是用户可能会以几种不同类型之一输入数据。如何选择将在运行时使用的数据类型?

如果我单独使用每种类型,效果很好;我只需要在不更改代码或为每种数据类型重写重载函数的情况下涵盖所有可能性。

下面我提供了我的代码的相关部分。正如我所说,我的类成员函数没有问题。

我已经尝试过创建队列的 x 类型版本的 switch 语句,但它不能作为以后在 switch 中与其他队列数据类型“矛盾”的可能性。我目前正在尝试 if/else if 语句,除了当我尝试使用 x 类型的输入时没有错误,它说它是未定义的。

// From Source.cpp

#include <iostream>
#include <string>
using namespace std;
#include "LQueue.h"
int mainMenu();
int main()
{
int value;
bool stop = false;
Queue<int> *theQueue;
int choice = mainMenu();

if (choice == 1) {
Queue<int> theQueue;
int dataType;
}
else if (choice == 2) {
Queue<double> theQueue;
double dataType;
}
else if (choice == 3) {
Queue<string> theQueue;
string dataType;
}
else if (choice == 4) {
Queue<char> theQueue;
char dataType;
}

cout << "\n\nHow many items would you like to initially"
<< " populate the queue with? ";
int howMany;
cin >> howMany;

for (int i = 0; i < howMany; i++)
{
cin >> dataType;
theQueue.enqueue(dataType)
}

theQueue.display(cout);

theQueue.dequeue();

theQueue.display(cout);

return 0;
}
int mainMenu()
{
int choice;
cout << "What type of data will you be storing in the queue?\n"
<< "1. integers\n2. decimal numbers\n3. words\n4. chars\n\n";

cin >> choice;
if (choice > 0 && choice < 5)
return choice;

cout << "\n\nInvalid choice\n\n";
mainMenu();
}
// Guess I'll include shown functions from the Queue class file below

//--- Definition of enqueue()
template <typename QueueElement>
void Queue<QueueElement>::enqueue(const QueueElement & value)
{
if (empty())
{
myFront = myBack = new Node(value);
}
else
{
myBack->next = new Node(value);
myBack = myBack->next;
}
}

//--- Definition of dequeue()
template <typename QueueElement>
void Queue<QueueElement>::dequeue()
{
if (empty() == false)
{
Queue::NodePointer oldFront = myFront;
myFront = myFront->next;
delete oldFront;
}
}

//--- Definition of display()
template <typename QueueElement>
void Queue<QueueElement>::display(ostream & out) const
{
Queue::NodePointer ptr;
for (ptr = myFront; ptr != 0; ptr = ptr->next)
out << ptr->data << " ";
out << endl;

}

//--- Definition of front()
template <typename QueueElement>
QueueElement Queue<QueueElement>::front() const
{
if (!empty())
return (myFront->data);
else
{
cerr << "*** Queue is empty "
" -- returning garbage ***\n";
QueueElement * temp = new(QueueElement);
QueueElement garbage = *temp; // "Garbage" value
delete temp;
return garbage;
}
}

Compiler (visual studio 2017) is showing identifier "dataType" is undefined within the following loop:
```c++

for (int i = 0; i < howMany; i++)
{
cin >> dataType;
theQueue.enqueue(dataType);
}

2 个错误:“cin >> dataType;”上的 E0020 和 C2065线,还有另一条下一行C2065

也许有更有效的整体方法来做到这一点?我愿意接受任何和所有的建议,谢谢!

最佳答案

问题(a problem)是你写的时候

    if (choice == 1) {
Queue<int> theQueue;
int dataType;
}
else if (choice == 2) {
Queue<double> theQueue;
double dataType;
}
else if (choice == 3) {
Queue<string> theQueue;
string dataType;
}
else if (choice == 4) {
Queue<char> theQueue;
char dataType;
}

您定义了四个不同的 theQueue 和四个不同的 dataType 变量,每个变量仅在相应的 if 的相应主体内有效.

所以,当你写

    for (int i = 0; i < howMany; i++)
{
cin >> dataType;
theQueue.enqueue(dataType)
}

theQueue.display(cout);

theQueue.dequeue();

theQueue.display(cout);

没有更多的 dataTypetheQueue 可用(它们都超出了范围)。

我建议如下

    if (choice == 1) {
foo<int>();
}
else if (choice == 2) {
foo<double>();
}
else if (choice == 3) {
foo<std::string>();
}
else if (choice == 4) {
foo<char>();
}

其中 foo() 是一个几乎像这样的模板函数(注意:代码未经测试)

template <typename T>
void foo ()
{
Queue<T> theQueue;
T dataType;

std::cout << "\n\nHow many items would you like to initially"
<< " populate the queue with? ";
int howMany;
std::cin >> howMany;

for (int i = 0; i < howMany; i++)
{
std::cin >> dataType;
theQueue.enqueue(dataType)
}

theQueue.display(cout);

theQueue.dequeue();

theQueue.display(cout);
}

关于c++ - 如何允许用户确定模板类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com