Überladene Funktion mit einem Parameter aufgerufen, aber ich dachte, dass ich zwei übergeben würde

StackOverflow https://stackoverflow.com/questions/2475657

Frage

Ich habe vor kurzem Refactoring Code wie dieser (MyClass zu MyClassR).

#include <iostream>

class SomeMember
{
public:
  double m_value;

  SomeMember() : m_value(0) {}
  SomeMember(int a) : m_value(a) {}
  SomeMember(int a, int b)
  : m_value(static_cast<double>(a) / 3.14159 +
            static_cast<double>(b) / 2.71828)
  {}
};


class MyClass
{
public:
SomeMember m_first, m_second, m_third;

MyClass(const bool isUp, const int x, const int y)
{
  if (isUp)
  {
    m_first = SomeMember(x);
    m_second = SomeMember(y);
    m_third = SomeMember(x, y);
  }
  else
  {
    m_first = SomeMember(y);
    m_second = SomeMember(x);
    m_third = SomeMember(y, x);
  }
}
};


class MyClassR
{
public:
SomeMember m_first, m_second, m_third;

MyClassR(const bool isUp, const int x, const int y)
: m_first(isUp ? x : y)
, m_second(isUp ? y : x)
, m_third(isUp ? x, y : y, x)
{
}
};


int main()
{
    MyClass a(true, 1, 2);
    MyClassR b(true, 1, 2);

    using namespace std;
    cout.precision(10);
    cout
        << "a:" << endl
        << "\tfirst: " << a.m_first.m_value 
        << "\tsecond: " << a.m_second.m_value 
        << "\tthird: " << a.m_third.m_value << endl;

    cout
        << "b:" << endl
        << "\tfirst: " << b.m_first.m_value
        << "\tsecond: " << b.m_second.m_value
        << "\tthird: " << b.m_third.m_value << endl;

    return 0;
}
  • Was ist der Fehler,
  • warum es kompiliert (getestet mit VC6 sowie VC9 Warnstufe 4 : keine Beschwerden) und
  • was ist der richtige Weg, es zu tun?

I (übernehmen) Ich habe bereits all diese Antworten aber ich denke, es ist und interessantes Problem zu teilen.

Aktualisieren
Erweiterter Code so ist es "copy & paste & Ausführen" -able. VC9 gab mir keine Beschwerden entweder so VC6 ist nicht das Problem hier.
Der Vollständigkeit halber ist die Ausgabe:

a:
        first: 1        second: 2       third: 1.054069532
b:
        first: 1        second: 2       third: 1.004499999
War es hilfreich?

Lösung

Ich bin sicher nicht das, was Sie genau erwarten würde, aber lassen Sie uns beginnen ...

  • Zunächst einmal, Graben VC6. Ernsthaft. es zu verwenden ist ein großes Problem, da es einfach nicht Standards entsprechen, und schließt eine Menge von Optionen. Die Benutzung ist richtig wie russisches Roulette spielen.

  • Ihr Konstruktor m_third nicht tut, was Sie denken, es tut. . „Mehrere Parameter“ ist keine gültige Ausdruck in C ++, und der bedingte Operator arbeitet auf Ausdrücke

  • : Sie können nicht einen bedingten Ausdruck wie folgt schreiben
  • Der Code kompiliert, weil es immer noch richtig , es funktioniert einfach nicht tun, was Sie wollen es. Statt „mehrere Parameter“ verwendet wird, wertet es die Sequenz Punktoperator (,), die nur nimmt die letzte Wert des Ausdrucks, so dass Ihre Bedingung effektiv entspricht: isUp ? y : x

  • Der richtige Weg ist die Verwendung zwei conditionals: m_third(isUp ? x : y, isUp ? y : x)

  • Der dritte Konstruktor SomeMember falsch ist, kann der Wert überfluten, einen negativen Wert ergibt. - Ich hoch Zweifel daran, dass das, was Sie wollen

Andere Tipps

m_third(isUp ? x, y : y, x)

Das sieht falsch. Der erste x ist ein sinnloser Ausdruck als es keine Nebenwirkungen, und das Ergebnis ist nicht verwendet wird, dann wird die beiden Seiten der : die gleichen Wert und die Nebenwirkungen haben, so ?: als Ausdruck elimintated werden kann, bevor der ? auch keine Nebenwirkungen hat .

m_third(y, x)

Aber jetzt ist es nicht tun, was der ursprüngliche Code tut ... dann ist dies der Fehler?

  

Was ist der Fehler   was ist der richtige Weg, es zu tun?

Ich denke, Ihre Absicht ist es eine Art naive Verwendung von Komma-Operator in Kombination mit ternären zeigen?, Vielleicht gibt es einige clevere und unerwarteten Operator Priorität Gotcha versteckt, aber ich denke, der Code absolut künstlich ist. Ist dies der Punkt ist, als ich den „richtige Weg, es zu tun“, sagen würde, ist nicht C ++ verwenden oder sie zuerst lernen, bevor es zu benutzen. Ja, es hat viele Konstrukte, die wie „Macken“ aussehen kann, und Sie können eine Menge seltsam suchen Code durch einen Compiler akzeptiert erstellen. Durch die Verwendung von C ++ Ich würde sagen, Sie die Werkzeuge, angenommen kennen.

  

Warum ist nicht kompiliert

Weil es keinen Fehler enthält und es ist ein richtiger C ++ Code ohne Zweideutigkeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top