[英]Initialize public attributes with argument from class constructor in c++
我有一个在.cpp文件中实现的类,如下所示:
#include <ctime>
#include <iostream>
// les 3 lib boost/random nécessaire a généré les radiuses
#include "boost/random/mersenne_twister.hpp"
#include "boost/random/normal_distribution.hpp"
#include "boost/random/variate_generator.hpp"
// la lib boost fournissant des arrays multidimensionnels
#include "boost/multi_array.hpp"
#include "porenetwork.h"
using namespace std;
typedef boost::random::mt19937 ENG;
typedef boost::normal_distribution<double> DIST; // Normal Distribution
typedef boost::variate_generator<ENG,DIST> GEN; // Variate generator
typedef boost::multi_array<bool, 3> StateNetworkType;
typedef boost::multi_array<double, 3> RadiusNetworkType;
typedef StateNetworkType::index index;
typedef boost::multi_array_types::index_range range;
PoreNetwork::PoreNetwork(int esize)
{
cout << "esize = " << esize << endl;
Size = esize;
StateNetworkType States(boost::extents[Size][Size][Size]);
RadiusNetworkType Radiuses(boost::extents[Size][Size][Size]);
// initialise the Radiuses
ENG eng;
eng.seed(static_cast<unsigned int>(std::time(0)));
DIST dist(0,1);
GEN gen(eng, dist);
for(index i = 0; i != Size; ++i)
for(index j = 0; j != Size; ++j)
for(index k = 0; k != Size; ++k)
Radiuses[i][j][k] = gen();
}
int PoreNetwork::getSize() {return Size;}
并在标题.h文件中定义如下:
#ifndef PORENETWORK_H
#define PORENETWORK_H
#include "boost/multi_array.hpp"
typedef boost::multi_array<bool, 3> StateNetworkType;
typedef boost::multi_array<double, 3> RadiusNetworkType;
class PoreNetwork
{
public:
PoreNetwork(int esize);
int getSize();
StateNetworkType States;
RadiusNetworkType Radiuses;
private:
int Size;
/* add your private declarations */
};
#endif /* PORENETWORK_H */
我的问题是,当我从main.cpp调用它时,属性PoreNetwork :: Radiuses和PoreNetwork :: States似乎没有被初始化。
据我所知,我的.cpp中的Radiuses和States不是我头文件中定义的那些因为我重新定义它们。
我的问题是:如何在我的类中定义和初始化这两个属性,知道它们是Boost :: multi_array,并且它们的构造函数将我的类构造函数所采用的参数作为输入。
即:我的PoreNetwork类的构造函数接受一个参数esize,它是一个int,也是其属性Radiuses和States的构造函数的参数。
初始化成员的最佳方法是使用初始化列表。 但您仍需要注意会员申报单和初始订单。
class PoreNetwork
{
private:
int Size; // note, put Size in front of States/Radiuses members
public:
PoreNetwork(int esize);
int getSize();
StateNetworkType States;
RadiusNetworkType Radiuses;
};
PoreNetwork::PoreNetwork(int esize)
: Size(esize), // important to initialise Size first
States(boost::extents[Size][Size][Size]),
Radiuses(boost::extents[Size][Size][Size])
{
cout << "esize = " << esize << endl;
}
如果您不首先初始化大小,则初始化状态的未定义行为和Radiuses和大小尚未初始化。
PoreNetwork::PoreNetwork(int esize)
: States(boost::extents[Size][Size][Size]), // Undefined behavior as Size is not initialised yet
Radiuses(boost::extents[Size][Size][Size]),
Size(esize)
如果你没有把大小放在成员列表中的States / Radiuses前面,你会得到编译器警告。
使用初始化列表:
PoreNetwork::PoreNetwork(int esize) :
States(boost::extents[esize][esize][esize]),
Radiuses(boost::extents[esize][esize][esize]),
Size(esize)
{
...
}
成员变量构造函数的调用方式如下:
PoreNetwork::PoreNetwork(int esize) :
States(boost::extents[esize][esize][esize]),
Radiuses(boost::extents[esize][esize][esize])
{
...
}
这意味着在将它们应用于成员变量之前,很难使用体内的构造函数参数。 如果你不能调用resize()(或类似的东西),使用像boost :: extents这样的函数通常是唯一的选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.