0

这里是新手,所以放轻松:) 我已经用谷歌搜索了,似乎真的找不到一个优雅的解决方案。我正在做一些编码来学习一些概念。

我有一个名为“sally”的类,它有一个重载两次的构造函数,即我的 sally.cpp 是:

#include "sally.h"
#include <iostream>
#include <string>
using namespace std;


sally::sally()
{
}
sally::sally(int x)
{
    inputvarint = x;
    cout << "you have an int of value: " << inputvarint << endl;
}

sally::sally(string y)
{
    inputstring = y;
    cout << "you have a string that is: " << inputstring << endl;
}

在我的 main.cpp 中,如果我创建对象sally myobj;然后通过对象调用函数,即sally.myobj(55)我得到正确的构造函数并告诉我我有一个 INT 值,或者如果我去sally.myobj("johhny")我让另一个构造函数去告诉我有一个字符串,上面写着“johnny”,所以那部分我很好。

我想知道的是,有没有一种优雅的方式可以使用 CIN 从用户那里获取输入,或者直接将其传递给对象 - 不使用变量(我已经尝试过但无法让它工作)。

基本上,我希望用户能够输入一个字符串或一个 int 并在 sally.myobj(); 中使用它。调用,并让构造函数来确定它是什么类型的数据。

之类的东西: auto x = 0;然后cin >> x不工作,因为最初的声明是一个 int,所以它保持这样。

有没有办法声明一个没有类型的变量并根据 CIN 的输入为其分配一个类型?

抱歉,如果这个问题的答案非常明显,但我正处于旅程的开始阶段(我正在学习这个人的第 40 篇教程:http ://www.youtube.com/watch?v=tvC1WCdV1XU )并阅读 Stanley Lippman 的 C++ Primer(第 5 版)和 Matt Weisfield 的 The Object-Oriented Thought Process。它们是我目前唯一的资源(那个和谷歌)。

提前致谢

塞布

编辑:

在看到下面的一些回复后,它帮助我弄清楚了什么可以/不能做什么,我已经使用一个利用一些正则表达式的解析函数来解决它,如果字符串内容被认为是 INT 然后转换它并将其放入一个新变量并关闭到构造函数中:

莎莉.cpp:

#include "sally.h"
#include <iostream>
#include <string>
#include <regex>
using namespace std;

sally::sally()
{
}
sally::sally(int x)
{
    inputvarint = x;
    cout << "Constructor output: you have an int of value: " << inputvarint << endl;
}

sally::sally(string y)
{
    inputstring = y;
    cout << "Constructor Output: you have a string that is: " << inputstring << endl;
}
void sally::StringParser(string x){

regex e("^[0-9]+$"); //test if the string starts with ends with and has a whole lot of numbers in between, i.e. and INT of any length

bool match = regex_match(x, e);

if(match){
    cout << "you have an int" << endl;
    int newvar = atoi(x.c_str());
    sally::sally(newvar);
}
else {sally::sally(x);}


}

然后我简单地说sally myobj;xmyobj.StringParser(x);是来自 CIN 的输入,Parsing 函数负责其余部分并将其传递给构造函数。

我确信我可以使用具有不同 REGEX 的 SWITCH 语句来处理浮点数等,然后创建额外的构造函数。但就目前而言,我似乎找到了解决方案。

热衷于看看我的方法是否有任何问题。

4

3 回答 3

1

I think c++ variables must always have a type. IN this case is better to save it as a string and then evaluate it. If its a number, convert to int and pass to the constructor: If its not a number pass the string to the constructor You can check if its a number using something like this:

bool is_number(const std::string& s)
{
  std::string::const_iterator it = s.begin();
  while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

from How to determine if a string is a number with C++?

For converting the string to an int, there a various ways, but you can try this one:

string str = "123";
int numb;
istringstream ( str ) >> numb;

So the final idea would be something like:

get input as a string
if(input is a number)
{
  convert to number;
  call constructor;
}
else
  call constructor with the string

Hope helped you out.

于 2013-04-05T08:32:31.957 回答
1

不幸的是,真的没有办法做到这一点。

可以做的是将输入读取为字符串,然后尝试使用 eg 将其转换为整数,std::stoi如果成功,则您有一个整数。


不引发异常的替代方法是使用std::strtol

于 2013-04-05T08:20:40.373 回答
0

您遇到的问题不是特定于C++的问题。但是关于输入编码的一般问题。

如果不向您的输入添加一些附加信息,就不可能实现所需的操作。

当您阅读字符输入时,如果给定输入“ 2 ”,则无法区分以下两种使用场景:

  • 你想打电话给莎莉(2)

  • 你想打电话给莎莉(“2”)

您必须在输入中提供一些附加(类型)信息以区分这两种情况(例如“i:2”和“s:2”)并尝试解析指示的值。

于 2013-04-05T08:28:34.530 回答