ここではまったくの初心者なので、簡単に行ってください:)私はグーグルで検索しましたが、これに対するエレガントな解決策を実際に見つけることができないようです。いくつかの概念を学ぶためにコーディングを行っています。
私は '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 ステートメントを使用して、これを少し構築できると確信しています。しかし、今のところ、解決策を見つけたようです。
私のアプローチに問題があるかどうかを確認したい。