【发布时间】:2014-03-19 23:03:52
【问题描述】:
我现在正在创建一个类来包装一些 MPI 通信函数,我使用特定的 MPI 通信器构建这些函数。我希望该类具有可用作常量成员变量的等级和通信器大小。不幸的是,这些只能通过将指向 int 的指针传递给 C 函数来获得。
class Comm {
public:
const int rank;
const int size;
Comm(MPI_Comm);
};
Comm::Comm(MPI_Comm c) {
MPI_Comm_rank(c, &rank); //error: rank is const
}
想到两种方法来解决这个问题:
1) 从其他获取值的类继承
class Initializer {
protected:
int hiddenSize;
int hiddenRank;
public:
Initializer(MPI_Comm);
}
class Comm : private Initializer {
public:
const int size;
const int rank;
Comm(MPI_Comm);
}
Initializer::Initializer(MPI_Comm c) {
MPI_Comm_rank(c, &hiddenRank);
MPI_Comm_size(c, &hiddenSize);
}
Comm::Comm(MPI_Comm c) : Initializer(c), rank(hiddenRank), size(hiddenSize) {}
2) 使成员只能通过函数调用访问
class Comm {
private:
int rank;
int size;
public:
Comm(MPI_Comm);
int getRank();
int getSize();
};
Comm::Comm(MPI_Comm c) {
MPI_Comm_rank(c, &rank);
MPI_Comm_size(c, &size);
}
int Comm::getRank() {
return rank;
}
int Comm::getSize() {
return size;
}
我想知道我是否错过了一种更优雅的处理方式,以及两者的相对优点和缺点。
【问题讨论】:
标签: c++ class constants mpi initializer