在我的代码中,我有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;
}
};
答案 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;
}
};