是否可以在构造函数上创建if语句?

时间:2015-10-02 13:24:53

标签: c++ operator-overloading

在我的代码中,我有3个不同的构造函数,一个需要两个双精度,一个需要3个双精度,一个不需要任何东西。

我还有一个重载我的<<所以它可以打印出来,但当时只有其中一个。

OnePoint a(3.2, 3.2, 3.2); 
    OnePoint b(3.1, 3.1); 

    cout << a << endl; 
    cout << b << endl; 

我有什么方法可以写:

If(调用带有2个参数的构造函数){

(然后这样做)

} else {Do this}

#include <iostream>
    using namespace std;
    #include <vector>

    class OnePoint {
    private:
        double xvalue;
        double yvalue;
        double zvalue; 

    public:
        OnePoint(double x, double y) {
            xvalue = x;
            yvalue = y;
        }
        OnePoint(double x, double y, double z) {
            xvalue = x;
            yvalue = y;
            zvalue = z; 
        }
        OnePoint() {

        }

        friend ostream& operator<<(ostream& printh, OnePoint& cPoint) {
            if () { //Here
                printh << "(" << cPoint.xvalue << ',' << cPoint.yvalue << ")";

            }
            else {
                printh << "(" << cPoint.xvalue << ',' << cPoint.yvalue << "," << cPoint.zvalue << ")";
            }
            return printh;

        }

    };

3 个答案:

答案 0 :(得分:2)

既然你:

#include <vector>

好像你可能只想使用它:

class OnePoint {
private:
    std::vector<double> values;

public:
    OnePoint() { }
    OnePoint(std::initializer_list<double> v) : values(v) { }

    friend std::ostream& operator<<(std::ostream& os, const OnePoint& cPoint) {
        os << '(';
        bool first = true;
        for (double v : cPoint.values) {
            if (!first) os << ", ";
            os << v;
            first = false;
        }
        return os << ')';
    }
};

请注意,您应该OnePoint引用operator<<中的 const ,而不仅仅是引用。

这允许:

std::cout << OnePoint{} << std::endl;          // prints ()
std::cout << OnePoint{1.0, 2.0} << std::endl;  // prints (1, 2)

答案 1 :(得分:2)

您的示例反映了一种奇怪的设计选择。它好像你想让同一个类代表两种点。你当前的设计有一个丑陋的问题&#34;如果我尝试将2d点添加到3d点会发生什么?&#34;

这里有两个优雅的答案,要么打印行为不打印0值-d Z坐标(意味着所有点都是3d,但是2d点可以伪造它),或者使用两个不同的类。前者允许你将2d和3d点加在一起,后者不允许它。两者都比你目前允许的情况要好,但会破坏事情。

我建议前者使用if-statement来检测0&z-z值

你的场景可能涉及更复杂的东西,比如多态,但它不太可能。

此外,大多数程序员只会为2d和3d点打印(x, y, z)(我们是一堆懒惰的人)。

答案 2 :(得分:-3)

如何录制呢?

#include <vector>

class OnePoint {
private:
    double xvalue;
    double yvalue;
    double zvalue;
    bool constructor_with_2_parameters_is_called;

public:
    OnePoint(double x, double y) {
        xvalue = x;
        yvalue = y;
        constructor_with_2_parameters_is_called = true;
    }
    OnePoint(double x, double y, double z) {
        xvalue = x;
        yvalue = y;
        zvalue = z;
        constructor_with_2_parameters_is_called = false;
    }
    OnePoint() {
        constructor_with_2_parameters_is_called = false;
    }

    friend ostream& operator<<(ostream& printh, OnePoint& cPoint) {
        if (constructor_with_2_parameters_is_called) {
            printh << "(" << cPoint.xvalue << ',' << cPoint.yvalue << ")";

        }
        else {
            printh << "(" << cPoint.xvalue << ',' << cPoint.yvalue << "," << cPoint.zvalue << ")";
        }
        return printh;

    }

};