【问题标题】:Initializing C++ const members with data from function (MPI_comm_size/rank)使用来自函数的数据初始化 C++ const 成员 (MPI_comm_size/rank)
【发布时间】: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


    【解决方案1】:

    您可以编写包装函数来初始化初始化列表中的const 成员。

    class Comm {
    public:
        const int rank;
        const int size;
        Comm(MPI_Comm) : rank(get_rank(c)), size(get_size(c)) {}
    
    private:
        static int get_rank(MPI_Comm c) {
            int rank;
            MPI_Comm_rank(c, &rank);
            return rank;
        }
        // and likewise for size
    };
    

    这比使用仅在构造期间使用的“隐藏”成员使对象膨胀更整洁;并且可能比带有访问器的私有变量更好,因为您可以在类的成员中强制执行 const 正确性。

    【讨论】:

    • 我不知道这是可能的——这正是我想要的。谢谢,迈克。
    【解决方案2】:

    你应该在构造函数初始化列表中初始化const成员

    class A {
        const int i;
        A(int c) : i(c) {
           ....
        }
    };
    

    如果您需要使用复杂的表达式初始化i,您可能需要有一个静态 成员函数。见http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多