我正在写一段这样构成的代码:
//field.h
class Field {
std::vector<std::vector<double>> data;
public:
Field(int, int);
};
Field::Field (int dim0, int dim1) :: data(dim0, std::vector<double>(dim1, 0)) { }
然后我在另一个类中使用此Field:
//approx.h
class Field;
class Approx {
Field SWAP;
public:
Approx(int, int);
};
Approx::Approx (int size, int dim) { }
/*I want to initialise SWAP like this:
if (size > dim) SWAP(size, dim)
else SWAP(dim, size)
*/
我不知道该怎么做。我想没有初始化列表是不可能的吗?我什至可以在初始化程序列表中问这些问题吗?
如果还有其他方法可以解决,我将不胜感激。
答案 0 :(得分:3)
不应该使用std :: min和max做这招吗?
class Field;
class Approx {
Field SWAP;
public:
Approx(int, int);
};
Approx::Approx (int size, int dim): SWAP(std::max(size,dim), std::min(size,dim))
{ }
答案 1 :(得分:3)
有两种方法可以解决此问题。首先,您可以只使用std::min
和std::max
来获取正确的值,例如
Approx::Approx (int size, int dim) : SWAP(std::max(dim, size), std::min(dim, size)) {}
第二,您可以编写一个lambda并像这样立即调用它
Approx::Approx (int size, int dim) : SWAP([](auto size, auto dim){ if (size > dim) return Field(size, dim); else return Field(dim, size); }(size, dim)) {}
如果您不喜欢将代码包含在初始化列表中,则可以将其放入私有静态函数中,然后调用该函数。
答案 2 :(得分:1)
使用委托构造函数的另一种方法:
class Approx
{
private:
Field SWAP;
private:
explicit Approx(std::pair<const int&, const int&> p) : SWAP(p.second, p.first) {}
public:
Approx(int size, int dim) : Approx(std::minmax(size, dim) {}
// ...
};
答案 3 :(得分:-2)
您还可以使用std::unique_ptr
初始化构造函数主体中的成员变量,例如:
class Approx {
std::unique_ptr<Field> SWAP {nullptr};
public:
Approx(int, int);
};
Approx::Approx (int size, int dim) {
if (size > dim) {
SWAP = std::make_unique<Field>(size, dim);
} else {
SWAP = std::make_unique<Field>(dim, size);
}
}