0

ここではまったくの初心者なので、簡単に行ってください:)私はグーグルで検索しましたが、これに対するエレガントな解決策を実際に見つけることができないようです。いくつかの概念を学ぶためにコーディングを行っています。

私は 'sally' と呼ばれるクラスを持っています。これには 2 回オーバーロードされるコンストラクターがあります。つまり、私の 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;
}

sally myobj;オブジェクトを作成し、オブジェクトを介して関数を呼び出すと、main.cpp で、つまりsally.myobj(55)、正しいコンストラクターが起動して、値の INT があることを通知するかsally.myobj("johhny")、他のコンストラクターが実行されて通知される場合私は「johnny」という文字列を持っているので、その部分は問題ありません。

私が知りたいのは、CINを使用してユーザーから入力を受け取り、変数を使用せずにオブジェクトに直接渡すことができるエレガントな方法があるかどうかです(試してみましたが、動作しません)。

基本的に、ユーザーが文字列または int のいずれかを入力して、それを sally.myobj(); で使用できるようにしたいと考えています。呼び出し、コンストラクターに、それがどのタイプのデータであるかを判断する作業をさせます。

のようなもの: 最初の宣言が int だったので機能しないので、そのままですauto x = 0;cin >> x

型なしで変数を宣言し、CIN からの入力に基づいて型を割り当てる方法はありますか?

これに対する答えが盲目的に明らかである場合は申し訳ありませんが、私は旅の始まりにいます (私はこの男のチュートリアル 40 までです: http://www.youtube.com/watch?v=tvC1WCdV1XU )また、Stanley Lippman の C++ Primer (第 5 版) と Matt Weisfield の The Object-Oriented Thought Process も読んでください。それらは現在私の唯一のリソースです(それとグーグル)。

前もって感謝します

セブ

編集:

以下の回答のいくつかを見た後、何ができる/できないかを理解するのに役立ちました.Regexを利用する解析関数を使用してこのように取り組みました。文字列の内容が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);}


}

x は CIN からの入力であり、解析関数が残りを処理してコンストラクタに渡しsally myobj;ます。myobj.StringParser(x);

float などを処理し、追加のコンストラクターを作成するために、異なる REGEX を使用した SWITCH ステートメントを使用して、これを少し構築できると確信しています。しかし、今のところ、解決策を見つけたようです。

私のアプローチに問題があるかどうかを確認したい。

4

3 に答える 3

1

C++ 変数には常に型が必要だと思います。この場合、文字列として保存してから評価することをお勧めします。数値の場合は、int に変換してコンストラクターに渡します。数値でない場合は、文字列をコンストラクターに渡します。次のようなものを使用して、数値かどうかを確認できます。

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();
}

文字列がC++で数値かどうかを判断する方法は?

文字列を int に変換するには、さまざまな方法がありますが、次の方法を試すことができます。

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

したがって、最終的なアイデアは次のようになります。

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

希望はあなたを助けました。

于 2013-04-05T08:32:31.957 に答える
0

発生している問題は、C++に固有のものではありません。しかし、入力エンコーディングに関する一般的な問題。

入力に追加情報を追加しないと、目的の操作を実現することはできません。

入力 ' 2 ' が与えられた場合、文字入力を読み取っているため、次の 2 つの使用シナリオの間で違いが生じる可能性はありません。

  • サリーに電話したい(2)

  • サリーに電話したい("2")

この 2 つのケース (「i:2」と「s:2」など) を区別し、指定された値を解析するために、入力に追加の (型) 情報を指定する必要があります。

于 2013-04-05T08:28:34.530 に答える