[英]“dynamic constructor” in c++
我是C ++類的新手,我需要創建一個“ Plot”類,該類具有一種從文件中讀取數據並創建3d網格的方法。
我了解您可以使用默認值創建“默認”構造函數,也可以使用預定義值創建特殊的構造函數。
在我的“私人”部分中,我有:
int nx; // number of "x" values
int ny; // number of "y" values
int nz; // number of "z" values
double* grid; // one dimensional array which stores nx*ny*nz values
double tgrid(int ix, int iy, int iz); // function which searches grid and returns value
現在,我想創建我的“ plot”對象,然后再動態創建“ grid”數組。 是否有可能做到這一點? 還是在我第一次創建“繪圖”時需要聲明數組“網格”的大小?
使用std::vector grid;
作為您的會員。 然后,您可以使用grid.resize(nx*ny*nz)
強制設置所需大小, 或使用grid.push_back(value);
對於要添加到數組的每個值。
有可能的:
class Plot{
int nx; // number of "x" values
int ny; // number of "y" values
int nz; // number of "z" values
double* grid; // one dimensional array which stores nx*ny*nz values
double tgrid(int ix, int iy, int iz); // function which searches grid and returns value
public:
Plot()
{
grid = NULL;
}
~Plot()
{
delete[] grid;
}
void init(int x, int y, int z)
{
delete[] grid; //make sure no memory leaks since grid might have already been allocated
nx = x;
ny = y;
nz = z;
grid = new double[nx*ny*nz];
}
};
構建之后,只需調用方法init即可:
Plot p();
p.init(2,3,4);
編輯:
但是,您應該考慮Mark B的回答。 我還將使用std::
而不是動態分配的數組。 更容易管理。
編輯2:
根據康斯坦丁紐斯的回答,請init()
避免使用init()
方法。 如果您特別需要初始化AFTER構造,請使用它,否則將所有初始化邏輯保留在構造函數中。
這取決於應如何使用Plot
類。 如果您認為僅需要使用有效大小創建此類的對象,則不應允許使用默認構造函數。 您可以這樣定義自己的構造函數:
public:
Plot(int _nx, int _ny, int _nz) : nx(_nx), ny(_ny), nz(_nz)
{
// initialize your array
grid = new double[nx*ny*nz];
}
也不要忘記您的析構函數來清除分配的內存:
~Plot()
{
delete[] grid;
}
class Plot {
int nx; // number of "x" values
int ny; // number of "y" values
int nz; // number of "z" values
double* grid; // one dimensional array which stores nx*ny*nz values
double tgrid(int ix, int iy, int iz); // function which searches grid and returns value
public:
/* default constructor */
Plot() : nx(0), ny(0), nz(0), grid(NULL) { }
/* rule of five copy constructor */
Plot(const Plot& b) : nx(b.nx), ny(b.ny), nz(b.nz) {
int max = nx*ny*nz;
if (max) {
grid = new double(max);
for(int i=0; i<max; ++i)
grid[i] = b.grid[i];
} else
grid = NULL;
}
/* rule of five move constructor */
Plot(Plot&& b) : nx(b.nx), ny(b.ny), nz(b.nz) grid(b.grid) { b.grid = NULL; }
/* load constructor */
Plot(std::istream& b) : nx(0), ny(0), nz(0), grid(NULL) { Load(b); }
/* rule of five destructor */
~Plot() { delete[] grid; }
/* rule of five assignment operator */
Plot& operator=(const Plot& b) {
int max = b.nx*b.ny*b.nz;
double* t = new double[max];
for(int i=0; i<max; ++i)
t[i] = b.grid[i];
//all exceptions above this line, NOW we can alter members
nx = b.nx;
ny = b.ny;
nz = b.nz;
delete [] grid;
grid = t;
}
/* rule of five move operator */
Plot& operator=(Plot&& b) {
nx = b.nx;
ny = b.ny;
nz = b.nz;
delete [] grid;
grid = b.grid;
b.grid = NULL;
}
/* always a good idea for rule of five objects */
void swap(const Plot& b) {
std::swap(nx, b.nx);
std::swap(ny, b.ny);
std::swap(nz, b.nz);
std::swap(grid, b.grid);
}
/* your load member */
void Load(std::istream& in) {
//load data
//all exceptions above this line, NOW we can alter members
//alter members
};
};
int main() {
Plot x; //default constructor allocates no memory
Plot y(x); //allocates no memory, because x has no memory
Plot z(std::cin); //loads from stream, allocates memory
x = z; //x.grid is _now_ given a value besides NULL.
}
這回答了我的問題。 仍然:使用std :: vector。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.