<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup)]]></title><description><![CDATA[<p>Hallo, ich hoffe ich bin hier nicht fahlsch wenn ich euch mit Fragen dieser &quot;Schwierigkeit&quot; belästige.<br />
Fakt ist, dass ich erst seit kurzem mich mit dem Programmieren beschäftige, dazu hab ich mir das Buch:Einführung in die Programmierung mit C++ von Bjarne Stroustrup gekauft. In Kapitel 6 dieses Buches ist es Aufgabe einen Taschenrechner zu Programmieren und dabei Token und Token_stream zu implementieren. Der folgende Code ist erstmal größtenteils vom Lehrbuch abgeschrieben, dort wird er nur fragmenthaft beschrieben, ich wollte ihn daher erst zusammentragen und dann den Code &quot;verstehen&quot;.</p>
<pre><code class="language-cpp">class Token {
public:
    char kind;       
    double value; 
    Token(char ch)    
        :kind(ch), value(0) { }    
    Token(char ch, double val)   
        :kind(ch), value(val) { }
};

class Token_stream {
public:
Token_stream();
Token get();
void putback(Token t);
private:
bool full;
Token buffer;
};

Token_stream::Token_stream()
	:full(false), buffer(0) 
{}
void Token_stream::putback(Token t)
{
	if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
	buffer= t;
	full = true;
}

Token Token_stream::get()
{
	if(full)
	{
		full = false;
		return buffer;
	}
char ch;
cin &gt;&gt; ch;

switch (ch)
{
    case ';':
	case 'q':
	case '(' : case ')':case '+':case '-':case'*':case'/':case'%':
		return Token(ch);
	case '.':
	case '0': case '1': case '2': case '3' :case '4' : case '5' : case '6': case '7': case '8' : case '9':
		{ cin.putback(ch);
		double val;
		cin &gt;&gt; val;
		return Token('8',val);
		}
	default:
		error(&quot;Ungueltiges Token&quot;);
}
}

//-----------------------------------------------------------------------------

Token_stream ts;
Token t = ts.get();

//------------------------------------------------------------------------------

Token get_token()    
{
    char ch;
    cin &gt;&gt; ch;    

    switch (ch) {

    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);        
            double val;
            cin &gt;&gt; val;              
            return Token('8',val);   
        }
    default:
        error(&quot;Ungueltiges Token&quot;);
    }
}

//------------------------------------------------------------------------------

double expression();  

//------------------------------------------------------------------------------

double term();     

//------------------------------------------------------------------------------

double primary()    
{
    Token t = get_token();
    switch (t.kind) {
    case '(':    
        {    
            double d = expression();
            t = get_token();
            if (t.kind != ')') error(&quot;')' erwartet&quot;);
            return d;
        }
    case '8':           
        return t.value; 
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}
//------------------------------------------------------------------------------

int main()
try {
	double val = 0;
while (cin) { 
Token t = ts.get();
if(t.kind=='q') break;
if(t.kind==';')
	cout &lt;&lt;&quot;=&quot; &lt;&lt; val &lt;&lt; endl;
else
	ts.putback(t);
	val = expression();
}
    keep_window_open();
}
catch (exception&amp; e) {
    cerr &lt;&lt; e.what() &lt;&lt; endl;
    keep_window_open();
    return 1;
}
catch (...) {
    cerr &lt;&lt; &quot;Ausnahme\n&quot;;
    keep_window_open();
    return 2;
}

//------------------------------------------------------------------------------

double expression()
{
    double left = term();      
    Token t = ts.get();   
    while(true) {
		switch(t.kind){
		case '+':
			left+= term();
			t = ts.get;
			break;
		case '-':
		left -= term();
		t = ts.get();
		default:
			ts.putback(t);
			return left;
		}
	}
}
//------------------------------------------------------------------------------

double term()
{
    double left = primary();
    Token t = ts.get();    

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
            break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
        default:
			ts.putback(t);
            return left;
        }
    }
}
</code></pre>
<p>Ich benutze dazu die vom Lehrbuch vorgegebene Headerdatei:</p>
<pre><code class="language-cpp">#ifndef H112
#define H112 201004L

#include&lt;iostream&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cmath&gt;
#include&lt;cstdlib&gt;
#include&lt;string&gt;
#include&lt;list&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;
#include&lt;stdexcept&gt;

//------------------------------------------------------------------------------

#ifdef _MSC_VER
#include &lt;hash_map&gt;
using stdext::hash_map;
#else
#include &lt;ext/hash_map&gt;
using __gnu_cxx::hash_map;

namespace __gnu_cxx {

    template&lt;&gt; struct hash&lt;std::string&gt;
    {
        size_t operator()(const std::string&amp; s) const
        {
            return hash&lt;char*&gt;()(s.c_str());
        }
    };

} // of namespace __gnu_cxx
#endif

//------------------------------------------------------------------------------

#define unordered_map hash_map

//------------------------------------------------------------------------------

typedef long Unicode;

//------------------------------------------------------------------------------

using namespace std;

template&lt;class T&gt; string to_string(const T&amp; t)
{
	ostringstream os;
	os &lt;&lt; t;
	return os.str();
}

struct Range_error : out_of_range {	// enhanced vector range error reporting
	int index;
	Range_error(int i) :out_of_range(&quot;Range error: &quot;+to_string(i)), index(i) { }
};

// trivially range-checked vector (no iterator checking):
template&lt; class T&gt; struct Vector : public std::vector&lt;T&gt; {
	typedef typename std::vector&lt;T&gt;::size_type size_type;

	Vector() { }
	explicit Vector(size_type n) :std::vector&lt;T&gt;(n) {}
	Vector(size_type n, const T&amp; v) :std::vector&lt;T&gt;(n,v) {}
	template &lt;class I&gt;
	Vector(I first, I last) :std::vector&lt;T&gt;(first,last) {}

	T&amp; operator[](unsigned int i) // rather than return at(i);
	{
		if (i&lt;0||this-&gt;size()&lt;=i) throw Range_error(i);
		return std::vector&lt;T&gt;::operator[](i);
	}
	const T&amp; operator[](unsigned int i) const
	{
		if (i&lt;0||this-&gt;size()&lt;=i) throw Range_error(i);
		return std::vector&lt;T&gt;::operator[](i);
	}
};

// disgusting macro hack to get a range checked vector:
#define vector Vector

// trivially range-checked string (no iterator checking):
struct String : std::string {

	String() { }
	String(const char* p) :std::string(p) {}
	String(const string&amp; s) :std::string(s) {}
	template&lt;class S&gt; String(S s) :std::string(s) {}
	String(int sz, char val) :std::string(sz,val) {}
	template&lt;class Iter&gt; String(Iter p1, Iter p2) : std::string(p1,p2) { }

	char&amp; operator[](unsigned int i) // rather than return at(i);
	{
		if (i&lt;0||size()&lt;=i) throw Range_error(i);
		return std::string::operator[](i);
	}

	const char&amp; operator[](unsigned int i) const
	{
		if (i&lt;0||size()&lt;=i) throw Range_error(i);
		return std::string::operator[](i);
	}
};

#ifndef _MSC_VER
namespace __gnu_cxx {

    template&lt;&gt; struct hash&lt;String&gt;
    {
        size_t operator()(const String&amp; s) const
        {
            return hash&lt;std::string&gt;()(s);
        }
    };

} // of namespace __gnu_cxx
#endif

struct Exit : runtime_error {
	Exit(): runtime_error(&quot;Exit&quot;) {}
};

// error() simply disguises throws:
inline void error(const string&amp; s)
{
	throw runtime_error(s);
}

inline void error(const string&amp; s, const string&amp; s2)
{
	error(s+s2);
}

inline void error(const string&amp; s, int i)
{
	ostringstream os;
	os &lt;&lt; s &lt;&lt;&quot;: &quot; &lt;&lt; i;
	error(os.str());
}

#if _MSC_VER&lt;1500
	// disgusting macro hack to get a range checked string:
	#define string String
	// MS C++ 9.0 have a built-in assert for string range check
	// and uses &quot;std::string&quot; in several places so that macro substitution fails
#endif

template&lt;class T&gt; char* as_bytes(T&amp; i)	// needed for binary I/O
{
	void* addr = &amp;i;	// get the address of the first byte
						// of memory used to store the object
	return static_cast&lt;char*&gt;(addr); // treat that memory as bytes
}

inline void keep_window_open()
{
	cin.clear();
	cout &lt;&lt; &quot;Please enter a character to exit\n&quot;;
	char ch;
	cin &gt;&gt; ch;
	return;
}

inline void keep_window_open(string s)
{
	if (s==&quot;&quot;) return;
	cin.clear();
	cin.ignore(120,'\n');
	for (;;) {
		cout &lt;&lt; &quot;Please enter &quot; &lt;&lt; s &lt;&lt; &quot; to exit\n&quot;;
		string ss;
		while (cin &gt;&gt; ss &amp;&amp; ss!=s)
			cout &lt;&lt; &quot;Please enter &quot; &lt;&lt; s &lt;&lt; &quot; to exit\n&quot;;
		return;
	}
}

// error function to be used (only) until error() is introduced in Chapter 5:
inline void simple_error(string s)	// write ``error: s?? and exit program
{
	cerr &lt;&lt; &quot;Fehler: &quot; &lt;&lt; s &lt;&lt; '\n';
	keep_window_open();		// for some Windows environments
	exit(1);
}

// make std::min() and std::max() accessible:
#undef min
#undef max

#include&lt;iomanip&gt;
inline ios_base&amp; general(ios_base&amp; b)	// to augment fixed and scientific
{
	b.setf(ios_base::fmtflags(0),ios_base::floatfield);
	return b;
}

// run-time checked narrowing cast (type conversion):
template&lt;class R, class A&gt; R narrow_cast(const A&amp; a)
{
	R r = R(a);
	if (A(r)!=a) error(string(&quot;info loss&quot;));
	return r;
}

inline int randint(int max) { return rand()%max; }

inline int randint(int min, int max) { return randint(max-min)+min; }

inline double sqrt(int x) { return sqrt(double(x)); }	// to match C++0x

#endif
</code></pre>
<p>Beim Kompilieren sind jetzt relativ viele Fehler aufgetreten, jedoch reicht mein Kenntisstand nicht dieses zu behen bzw. zu verstehen. Vielleicht könnt ihr mir ja weiterhelfen.</p>
<p>MFG Vezax</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303314/taschenrechner-in-c-einführung-in-die-programmierung-mit-c-bjarne-stroustrup</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 09:16:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303314.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 May 2012 17:35:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Thu, 10 May 2012 20:38:14 GMT]]></title><description><![CDATA[<p>Hallo, ich hoffe ich bin hier nicht fahlsch wenn ich euch mit Fragen dieser &quot;Schwierigkeit&quot; belästige.<br />
Fakt ist, dass ich erst seit kurzem mich mit dem Programmieren beschäftige, dazu hab ich mir das Buch:Einführung in die Programmierung mit C++ von Bjarne Stroustrup gekauft. In Kapitel 6 dieses Buches ist es Aufgabe einen Taschenrechner zu Programmieren und dabei Token und Token_stream zu implementieren. Der folgende Code ist erstmal größtenteils vom Lehrbuch abgeschrieben, dort wird er nur fragmenthaft beschrieben, ich wollte ihn daher erst zusammentragen und dann den Code &quot;verstehen&quot;.</p>
<pre><code class="language-cpp">class Token {
public:
    char kind;       
    double value; 
    Token(char ch)    
        :kind(ch), value(0) { }    
    Token(char ch, double val)   
        :kind(ch), value(val) { }
};

class Token_stream {
public:
Token_stream();
Token get();
void putback(Token t);
private:
bool full;
Token buffer;
};

Token_stream::Token_stream()
	:full(false), buffer(0) 
{}
void Token_stream::putback(Token t)
{
	if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
	buffer= t;
	full = true;
}

Token Token_stream::get()
{
	if(full)
	{
		full = false;
		return buffer;
	}
char ch;
cin &gt;&gt; ch;

switch (ch)
{
    case ';':
	case 'q':
	case '(' : case ')':case '+':case '-':case'*':case'/':case'%':
		return Token(ch);
	case '.':
	case '0': case '1': case '2': case '3' :case '4' : case '5' : case '6': case '7': case '8' : case '9':
		{ cin.putback(ch);
		double val;
		cin &gt;&gt; val;
		return Token('8',val);
		}
	default:
		error(&quot;Ungueltiges Token&quot;);
}
}

//-----------------------------------------------------------------------------

Token_stream ts;
Token t = ts.get();

//------------------------------------------------------------------------------

Token get_token()    
{
    char ch;
    cin &gt;&gt; ch;    

    switch (ch) {

    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);        
            double val;
            cin &gt;&gt; val;              
            return Token('8',val);   
        }
    default:
        error(&quot;Ungueltiges Token&quot;);
    }
}

//------------------------------------------------------------------------------

double expression();  

//------------------------------------------------------------------------------

double term();     

//------------------------------------------------------------------------------

double primary()    
{
    Token t = get_token();
    switch (t.kind) {
    case '(':    
        {    
            double d = expression();
            t = get_token();
            if (t.kind != ')') error(&quot;')' erwartet&quot;);
            return d;
        }
    case '8':           
        return t.value; 
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}
//------------------------------------------------------------------------------

int main()
try {
	double val = 0;
while (cin) { 
Token t = ts.get();
if(t.kind=='q') break;
if(t.kind==';')
	cout &lt;&lt;&quot;=&quot; &lt;&lt; val &lt;&lt; endl;
else
	ts.putback(t);
	val = expression();
}
    keep_window_open();
}
catch (exception&amp; e) {
    cerr &lt;&lt; e.what() &lt;&lt; endl;
    keep_window_open();
    return 1;
}
catch (...) {
    cerr &lt;&lt; &quot;Ausnahme\n&quot;;
    keep_window_open();
    return 2;
}

//------------------------------------------------------------------------------

double expression()
{
    double left = term();      
    Token t = ts.get();   
    while(true) {
		switch(t.kind){
		case '+':
			left+= term();
			t = ts.get;
			break;
		case '-':
		left -= term();
		t = ts.get();
		default:
			ts.putback(t);
			return left;
		}
	}
}
//------------------------------------------------------------------------------

double term()
{
    double left = primary();
    Token t = ts.get();    

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
            break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
        default:
			ts.putback(t);
            return left;
        }
    }
}
</code></pre>
<p>Ich benutze dazu die vom Lehrbuch vorgegebene Headerdatei:</p>
<pre><code class="language-cpp">#ifndef H112
#define H112 201004L

#include&lt;iostream&gt;
#include&lt;fstream&gt;
#include&lt;sstream&gt;
#include&lt;cmath&gt;
#include&lt;cstdlib&gt;
#include&lt;string&gt;
#include&lt;list&gt;
#include&lt;vector&gt;
#include&lt;algorithm&gt;
#include&lt;stdexcept&gt;

//------------------------------------------------------------------------------

#ifdef _MSC_VER
#include &lt;hash_map&gt;
using stdext::hash_map;
#else
#include &lt;ext/hash_map&gt;
using __gnu_cxx::hash_map;

namespace __gnu_cxx {

    template&lt;&gt; struct hash&lt;std::string&gt;
    {
        size_t operator()(const std::string&amp; s) const
        {
            return hash&lt;char*&gt;()(s.c_str());
        }
    };

} // of namespace __gnu_cxx
#endif

//------------------------------------------------------------------------------

#define unordered_map hash_map

//------------------------------------------------------------------------------

typedef long Unicode;

//------------------------------------------------------------------------------

using namespace std;

template&lt;class T&gt; string to_string(const T&amp; t)
{
	ostringstream os;
	os &lt;&lt; t;
	return os.str();
}

struct Range_error : out_of_range {	// enhanced vector range error reporting
	int index;
	Range_error(int i) :out_of_range(&quot;Range error: &quot;+to_string(i)), index(i) { }
};

// trivially range-checked vector (no iterator checking):
template&lt; class T&gt; struct Vector : public std::vector&lt;T&gt; {
	typedef typename std::vector&lt;T&gt;::size_type size_type;

	Vector() { }
	explicit Vector(size_type n) :std::vector&lt;T&gt;(n) {}
	Vector(size_type n, const T&amp; v) :std::vector&lt;T&gt;(n,v) {}
	template &lt;class I&gt;
	Vector(I first, I last) :std::vector&lt;T&gt;(first,last) {}

	T&amp; operator[](unsigned int i) // rather than return at(i);
	{
		if (i&lt;0||this-&gt;size()&lt;=i) throw Range_error(i);
		return std::vector&lt;T&gt;::operator[](i);
	}
	const T&amp; operator[](unsigned int i) const
	{
		if (i&lt;0||this-&gt;size()&lt;=i) throw Range_error(i);
		return std::vector&lt;T&gt;::operator[](i);
	}
};

// disgusting macro hack to get a range checked vector:
#define vector Vector

// trivially range-checked string (no iterator checking):
struct String : std::string {

	String() { }
	String(const char* p) :std::string(p) {}
	String(const string&amp; s) :std::string(s) {}
	template&lt;class S&gt; String(S s) :std::string(s) {}
	String(int sz, char val) :std::string(sz,val) {}
	template&lt;class Iter&gt; String(Iter p1, Iter p2) : std::string(p1,p2) { }

	char&amp; operator[](unsigned int i) // rather than return at(i);
	{
		if (i&lt;0||size()&lt;=i) throw Range_error(i);
		return std::string::operator[](i);
	}

	const char&amp; operator[](unsigned int i) const
	{
		if (i&lt;0||size()&lt;=i) throw Range_error(i);
		return std::string::operator[](i);
	}
};

#ifndef _MSC_VER
namespace __gnu_cxx {

    template&lt;&gt; struct hash&lt;String&gt;
    {
        size_t operator()(const String&amp; s) const
        {
            return hash&lt;std::string&gt;()(s);
        }
    };

} // of namespace __gnu_cxx
#endif

struct Exit : runtime_error {
	Exit(): runtime_error(&quot;Exit&quot;) {}
};

// error() simply disguises throws:
inline void error(const string&amp; s)
{
	throw runtime_error(s);
}

inline void error(const string&amp; s, const string&amp; s2)
{
	error(s+s2);
}

inline void error(const string&amp; s, int i)
{
	ostringstream os;
	os &lt;&lt; s &lt;&lt;&quot;: &quot; &lt;&lt; i;
	error(os.str());
}

#if _MSC_VER&lt;1500
	// disgusting macro hack to get a range checked string:
	#define string String
	// MS C++ 9.0 have a built-in assert for string range check
	// and uses &quot;std::string&quot; in several places so that macro substitution fails
#endif

template&lt;class T&gt; char* as_bytes(T&amp; i)	// needed for binary I/O
{
	void* addr = &amp;i;	// get the address of the first byte
						// of memory used to store the object
	return static_cast&lt;char*&gt;(addr); // treat that memory as bytes
}

inline void keep_window_open()
{
	cin.clear();
	cout &lt;&lt; &quot;Please enter a character to exit\n&quot;;
	char ch;
	cin &gt;&gt; ch;
	return;
}

inline void keep_window_open(string s)
{
	if (s==&quot;&quot;) return;
	cin.clear();
	cin.ignore(120,'\n');
	for (;;) {
		cout &lt;&lt; &quot;Please enter &quot; &lt;&lt; s &lt;&lt; &quot; to exit\n&quot;;
		string ss;
		while (cin &gt;&gt; ss &amp;&amp; ss!=s)
			cout &lt;&lt; &quot;Please enter &quot; &lt;&lt; s &lt;&lt; &quot; to exit\n&quot;;
		return;
	}
}

// error function to be used (only) until error() is introduced in Chapter 5:
inline void simple_error(string s)	// write ``error: s?? and exit program
{
	cerr &lt;&lt; &quot;Fehler: &quot; &lt;&lt; s &lt;&lt; '\n';
	keep_window_open();		// for some Windows environments
	exit(1);
}

// make std::min() and std::max() accessible:
#undef min
#undef max

#include&lt;iomanip&gt;
inline ios_base&amp; general(ios_base&amp; b)	// to augment fixed and scientific
{
	b.setf(ios_base::fmtflags(0),ios_base::floatfield);
	return b;
}

// run-time checked narrowing cast (type conversion):
template&lt;class R, class A&gt; R narrow_cast(const A&amp; a)
{
	R r = R(a);
	if (A(r)!=a) error(string(&quot;info loss&quot;));
	return r;
}

inline int randint(int max) { return rand()%max; }

inline int randint(int min, int max) { return randint(max-min)+min; }

inline double sqrt(int x) { return sqrt(double(x)); }	// to match C++0x

#endif
</code></pre>
<p>Beim Kompilieren sind jetzt relativ viele Fehler aufgetreten, jedoch reicht mein Kenntisstand nicht dieses zu behen bzw. zu verstehen. Vielleicht könnt ihr mir ja weiterhelfen.</p>
<p>MFG Vezax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210258</guid><dc:creator><![CDATA[Vezax]]></dc:creator><pubDate>Thu, 10 May 2012 20:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Thu, 10 May 2012 17:51:41 GMT]]></title><description><![CDATA[<p>Vezax schrieb:</p>
<blockquote>
<p>Beim Kompilieren sind jetzt relativ viele Fehler aufgetreten, jedoch reicht mein Kenntisstand nicht dieses zu behen bzw. zu verstehen. Vielleicht könnt ihr mir ja weiterhelfen.</p>
<p>MFG Vezax</p>
</blockquote>
<p>Und welche waren das ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210267</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 10 May 2012 17:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Thu, 10 May 2012 19:29:08 GMT]]></title><description><![CDATA[<p>Das ist der Fehlertext den der Compiler ausgibt.</p>
<p>[code]1&gt;------ Erstellen gestartet: Projekt: C++ Taschenrechner, Konfiguration: Debug Win32 ------<br />
1&gt; Taschenrechner.cpp<br />
1&gt;c:\users\user\documents\visual studio 2010\projects\c++ taschenrechner\c++ taschenrechner\taschenrechner.cpp(186): error C3867: <strong>&quot;Token_stream::get&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;Token_stream::get&quot;, um einen Zeiger auf den Member zu erstellen.</strong><br />
1&gt;c:\users\user\documents\visual studio 2010\projects\c++ taschenrechner\c++ taschenrechner\taschenrechner.cpp(186): error C2679: <em><em>Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'Token (__thiscall Token_stream::</em> )(void)' akzeptiert (oder keine geeignete Konvertierung möglich)</em>*<br />
1&gt; c:\users\user\documents\visual studio 2010\projects\c++ taschenrechner\c++ taschenrechner\taschenrechner.cpp(37): <strong>kann 'Token &amp;Token::operator =(const Token &amp;)' sein</strong><br />
1&gt; bei Anpassung der Argumentliste '(Token, Token (__thiscall Token_stream::* )(void))'<br />
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210297</guid><dc:creator><![CDATA[Vezax]]></dc:creator><pubDate>Thu, 10 May 2012 19:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Fri, 11 May 2012 05:19:17 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u100590" rel="nofollow">Martin Richter</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f1" rel="nofollow">MFC (Visual C++)</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x und C++11)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210383</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Fri, 11 May 2012 05:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Fri, 11 May 2012 08:48:17 GMT]]></title><description><![CDATA[<p>Warum postest du nicht den Code, der die Fehlermeldung liefert? Ein Funktionsaufruf hat immer Klammern, die fehlen an der vom Compiler bemängelten Stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210441</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 11 May 2012 08:48:17 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Fri, 11 May 2012 08:55:40 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Warum postest du nicht den Code, der die Fehlermeldung liefert? Ein Funktionsaufruf hat immer Klammern, die fehlen an der vom Compiler bemängelten Stelle.</p>
</blockquote>
<p>Die Stelle ist übrigens</p>
<pre><code class="language-cpp">t = ts.get;
</code></pre>
<p>in expression().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210444</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 11 May 2012 08:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Fri, 11 May 2012 22:35:12 GMT]]></title><description><![CDATA[<p>Oh, das muss ich wohl übersehen haben. Der Code lässt sich jetzt kompilieren. Mir ist auch aufgefallen das die Zeichen ';' und 'q' garnicht als Token eingebunden waren.</p>
<pre><code class="language-cpp">Token get_token()    
{
    char ch;
    cin &gt;&gt; ch;    

    switch (ch) {

    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
	case ';': case 'q':
        {    
            cin.putback(ch);        
            double val;
            cin &gt;&gt; val;              
            return Token('8',val);   
        }
    default:
        error(&quot;Ungueltiges Token&quot;);
    }
}
</code></pre>
<p>Versuche ich dieses Programm zu benutzen, schließt sich das Fenster nach der Eingabe von ';' und Enter direkt. ohne den Void aus der Headerdatei aufzurufen.<br />
Mit der Fehlermeldung &quot;ungueltiges Token&quot; welcher in Default aufgerufen werden sollte, Allerdings habe ich doch nun ';' und 'q' eingebunden oder etwa nicht?</p>
<p>Edit: Ich hab es jetzt mehrmals probiert ohne eine Änderung am Code vorzunehmen und siehe da, der Taschenrechner funktioniert <s>ohne Probleme</s> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Edit2: Zu früh gefreut, der Taschenrechner funktioniert nur wenn man am Anfang nur einen Charakter (Zahl) eingibt und diesen ausrechnen lässt, danach sind alle Operationen möglich und auch korrekt. Tut man dies nicht kommen wir wieder zum oben beschrieben Fehler. Woran könnte das Liegen?</p>
<p>Danke auf die Hinweisung bezüglich der Funktion, ich werds mir merken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210723</guid><dc:creator><![CDATA[Vezax]]></dc:creator><pubDate>Fri, 11 May 2012 22:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Wed, 16 May 2012 19:03:25 GMT]]></title><description><![CDATA[<p>/Push<br />
Niemand evtl. ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212384</guid><dc:creator><![CDATA[Vezax]]></dc:creator><pubDate>Wed, 16 May 2012 19:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner in C++ (Einführung in die Programmierung mit C++, Bjarne Stroustrup) on Wed, 16 May 2012 19:42:42 GMT]]></title><description><![CDATA[<p>Vezax schrieb:</p>
<blockquote>
<p>Oh, das muss ich wohl übersehen haben. Der Code lässt sich jetzt kompilieren. Mir ist auch aufgefallen das die Zeichen ';' und 'q' garnicht als Token eingebunden waren.</p>
<pre><code class="language-cpp">Token get_token()    
{
    //...
    switch (ch) {
    /...
	case ';': case 'q':
        {    
            cin.putback(ch);        
            double val;
            cin &gt;&gt; val;              
            return Token('8',val);   
        }
    /...
}
</code></pre>
<p>Versuche ich dieses Programm zu benutzen, schließt sich das Fenster nach der Eingabe von ';' und Enter direkt. ohne den Void aus der Headerdatei aufzurufen.<br />
Mit der Fehlermeldung &quot;ungueltiges Token&quot; welcher in Default aufgerufen werden sollte, Allerdings habe ich doch nun ';' und 'q' eingebunden oder etwa nicht?</p>
</blockquote>
<p>Ja, schon. Aber warum willst Du ';' und 'q' in einen double einlesen? Das wird schiefgehen und das Zeichen wird im stream verbleiben - was zu unerwarteten Ergebnissen führen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212415</guid><dc:creator><![CDATA[SemikolonIstKeinDouble]]></dc:creator><pubDate>Wed, 16 May 2012 19:42:42 GMT</pubDate></item></channel></rss>